MySQL 原理与优化之Update 优化


Posted in MySQL onAugust 14, 2022

前言:

谈到Update 语句大家可能不会陌生,很多情况下我们都会使用它来更新table中的记录。一般而言我们会使用innodb 的存储引擎,innodb引擎是基于行锁的,具体一点说是针对索引来加锁的(保证锁不能失效),并不是针对记录加锁,如果对于没有建立索引的字段进行过滤操作,从而执行update 的话,会导致表锁 。

今天就看看在使用innodb的时候如何使用update 语句。

已经存在course 表,其内容如下:

MySQL 原理与优化之Update 优化

目前该表没有加任何的索引,默认情况下id 是表的索引。

接着让我们分别开启两个事务(两个客户端),分别执行下述指令。

开启第一个事务:

begin;
update course set name = 'Java' where id = 1;

MySQL 原理与优化之Update 优化

开启另外一个事务

begin;
update course set name = 'Spark' where id = 4;

MySQL 原理与优化之Update 优化

两个事务都可以执行,然后再分别执行两个事务的 commit 操作,就可以看到更新的结果。

MySQL 原理与优化之Update 优化

两个事务能够并行执行的条件是id 是表course 的索引,可以由于update id 分别对应2 和4 ,只是针对这两行记录进行加锁。

接着让我们看看另外一个例子,依旧是开启两个事务,但是where 条件选择使用name ,而且name 没有作为course 表的索引。

开启一个事务:

begin;
update course set name = 'Vue.js' where name = 'PHP';

然后再执行另外一个事务

begin;
update course set name = 'SQLServer' where name = 'MySQL';

此时在执行第二个事务的update 语句的时候,会被阻塞。就是因为针对name 的过滤条件并不是course 的索引,此时的update 语句进行了锁表的操作,必须等第一个事务commit之后,释放掉表锁,第二个事务才能继续执行。

MySQL 原理与优化之Update 优化

为了让两个事务能够并行执行,我们将name 加入到course 的索引中去。

create index index_name on course(name);
show index from course;

MySQL 原理与优化之Update 优化

接着再执行刚才的两个事务,这两个事务分别对不同的记录进行更新,where 中的name条件不一样的情况下,也不会出现锁表的情况,这是因为将name 作为了course 的索引。

为了演示方便,这里我们将更新的条件调整一下:

开启一个事务:

begin;
update course set name = 'PHP' where name = 'Vue.js';

然后再执行另外一个事务

begin;
update course set name = 'MySQL' where name = 'SQLServer';

结果和我们预想的一样,两个事务可以并行执行,同时在commit之后能够看到结果。

总结一下, 如果使用innodb存储引擎,update 的时候存在where 条件的情况下,条件字段是索引的情况可以提升更新的效率,避免锁表的情况发生。

到此这篇关于MySQL 原理与优化之Update 优化的文章就介绍到这了,更多相关MySQL Update 优化内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
正确使用MySQL INSERT INTO语句
May 26 MySQL
MySQL中存储时间的最佳实践指南
Jul 01 MySQL
MySQL into_Mysql中replace与replace into用法案例详解
Sep 14 MySQL
MySQL 服务和数据库管理
Nov 11 MySQL
一次SQL如何查重及去重的实战记录
Mar 13 MySQL
Linux系统下MySQL配置主从分离的步骤
Mar 21 MySQL
MySQL实战记录之如何快速定位慢SQL
Mar 23 MySQL
你真的会用Mysql的explain吗
Mar 31 MySQL
MySQL分区路径子分区再分区
Apr 13 MySQL
MySQL的意向共享锁、意向排它锁和死锁
Jul 15 MySQL
MySQL新手入门进阶语句汇总
Sep 23 MySQL
MySQL数据管理操作示例讲解
Dec 24 MySQL
MySql统计函数COUNT的具体使用详解
Aug 14 #MySQL
MySQL 原理与优化之Limit 查询优化
MySQL 原理优化之Group By的优化技巧
Aug 14 #MySQL
mysql函数之截取字符串的实现
Aug 14 #MySQL
MySQL 原理与优化之原数据锁的应用
MySql按时,天,周,月进行数据统计
Aug 14 #MySQL
MySQL中LAG()函数和LEAD()函数的使用
Aug 14 #MySQL
You might like
PHP捕获Fatal error错误的方法
2014/06/11 PHP
php实现修改新闻时删除图片的方法
2015/05/12 PHP
php判断用户是否手机访问代码
2015/06/08 PHP
PHP与Ajax相结合实现登录验证小Demo
2016/03/16 PHP
php远程请求CURL实例教程(爬虫、保存登录状态)
2020/12/10 PHP
Avengerls vs KG BO3 第一场2.18
2021/03/10 DOTA
写出更好的JavaScript程序之undefined篇(中)
2009/11/23 Javascript
基于JQuery的抓取博客园首页RSS的代码
2011/12/01 Javascript
JavaScript中几个重要的属性(this、constructor、prototype)介绍
2013/05/19 Javascript
php析构函数的具体用法小结
2014/03/11 Javascript
javascript中局部变量和全局变量的区别详解
2015/02/27 Javascript
浅谈JavaScript中指针和地址
2015/07/26 Javascript
JavaScript实现的MD5算法完整实例
2016/02/02 Javascript
使用js获取地址栏参数的方法推荐(超级简单)
2016/06/14 Javascript
AngularJs Dependency Injection(DI,依赖注入)
2016/09/02 Javascript
JavaScript利用正则表达式替换字符串中的内容
2016/12/12 Javascript
详解nodejs 文本操作模块-fs模块(一)
2016/12/22 NodeJs
Bootstrap超大屏幕的实现代码
2017/03/22 Javascript
vue watch普通监听和深度监听实例详解(数组和对象)
2018/08/16 Javascript
vue-resource post数据时碰到Django csrf问题的解决
2020/03/13 Javascript
在vue中使用Echarts画曲线图的示例
2020/10/03 Javascript
[03:51]吞吞映像 每周精彩击杀top10第二弹
2014/06/25 DOTA
收藏整理的一些Python常用方法和技巧
2015/05/18 Python
Python使用QRCode模块生成二维码实例详解
2017/06/14 Python
django用户登录和注销的实现方法
2018/07/16 Python
PyQt5固定窗口大小的方法
2019/06/18 Python
详解python中index()、find()方法
2019/08/29 Python
解决Python中回文数和质数的问题
2019/11/24 Python
统计学专业毕业生的自我评价分享
2013/11/28 职场文书
2013的个人自我评价
2013/12/26 职场文书
连锁酒店店长职责范本
2014/02/13 职场文书
护理专业自荐书
2014/06/04 职场文书
法人授权委托书样本
2014/09/19 职场文书
违章停车检讨书
2014/10/21 职场文书
导游词之韩国济州岛
2019/10/28 职场文书
CSS实现隐藏搜索框功能(动画正反向序列)
2021/07/21 HTML / CSS