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中in和exists区别详解
Jun 03 MySQL
解决mysql:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO/YES)
Jun 26 MySQL
MySQL8.0升级的踩坑历险记
Nov 01 MySQL
MySQL数据库10秒内插入百万条数据的实现
Nov 01 MySQL
MySQL中order by的使用详情
Nov 17 MySQL
Mysql分库分表之后主键处理的几种方法
Feb 15 MySQL
解决Mysql中的innoDB幻读问题
Apr 29 MySQL
MySQL的prepare使用以及遇到的bug
May 11 MySQL
MySQL 自动填充 create_time 和 update_time
May 20 MySQL
mysql5.5中文乱码问题解决的有用方法
May 30 MySQL
MySQL transaction事务安全示例讲解
Jun 21 MySQL
Mysql中mvcc各场景理解应用
Aug 05 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
苏联队长,苏联超人蝙蝠侠,这些登场的“山寨”英雄真的很严肃
2020/04/09 欧美动漫
德劲1104的电路分析与改良
2021/03/01 无线电
同一空间绑定多个域名而实现访问不同页面的PHP代码
2006/12/06 PHP
php URL验证正则表达式
2011/07/19 PHP
ThinkPHP模版引擎之变量输出详解
2014/12/05 PHP
PHP获取二维数组中某一列的值集合
2015/12/25 PHP
php显示页码分页类的封装
2017/06/08 PHP
PHP利用递归函数实现无限级分类的方法
2019/03/22 PHP
jQuery AJAX回调函数this指向问题
2010/02/08 Javascript
jquery 图片 上一张 下一张 链接效果(续篇)
2010/04/20 Javascript
js实现点击注册按钮开始读秒倒计时的小例子
2013/05/11 Javascript
javascript获得当前的信息的一些常用命令
2015/02/25 Javascript
初识Javascript小结
2015/07/16 Javascript
基于JS实现新闻列表无缝向上滚动实例代码
2016/01/22 Javascript
详解在AngularJS的controller外部直接获取$scope
2017/06/02 Javascript
jQuery实现的事件绑定功能基本示例
2017/10/11 jQuery
详解Vue项目引入CreateJS的方法(亲测可用)
2019/05/30 Javascript
JS实现简单移动端鼠标拖拽
2020/07/23 Javascript
openlayers4.6.5实现距离量测和面积量测
2020/09/25 Javascript
Python实现的批量下载RFC文档
2015/03/10 Python
Django框架中方法的访问和查找
2015/07/15 Python
对numpy中数组元素的统一赋值实例
2018/04/04 Python
Pycharm小白级简单使用教程
2020/01/08 Python
tensorflow 实现自定义梯度反向传播代码
2020/02/10 Python
Python中import导入不同目录的模块方法详解
2020/02/18 Python
详解查看Python解释器路径的两种方式
2020/10/15 Python
Python基于Webhook实现github自动化部署
2020/11/28 Python
利用python进行文件操作
2020/12/04 Python
美国知名的隐形眼镜电商:Contacts America
2019/11/19 全球购物
迪卡侬比利时官网:Decathlon比利时
2019/12/28 全球购物
毕业生实习鉴定
2013/12/11 职场文书
中学生差生评语
2014/01/30 职场文书
幼儿园教师考核制度
2014/02/01 职场文书
医学生个人求职信范文
2014/02/07 职场文书
高三家长寄语
2014/04/03 职场文书
运动会加油稿100字
2014/09/19 职场文书