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复制问题的三个参数分析
Apr 07 MySQL
详解MySQL 用户权限管理
Apr 20 MySQL
MySql学习笔记之事务隔离级别详解
May 12 MySQL
MySql开发之自动同步表结构
May 28 MySQL
MYSQL 无法识别中文的永久解决方法
Jun 03 MySQL
MySQL系列之八 MySQL服务器变量
Jul 02 MySQL
MySQL基于索引的压力测试的实现
Nov 07 MySQL
MYSQL 运算符总结
Nov 11 MySQL
MYSQL如何查看进程和kill进程
Mar 13 MySQL
MySQL创建管理HASH分区
Apr 13 MySQL
以MySQL5.7为例了解一下执行计划
Apr 13 MySQL
mysql查看表结构的三种方法总结
Jul 07 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
Bo-Blog专用的给Windows服务器的IIS Rewrite程序
2007/08/26 PHP
PHP图片验证码制作实现分享(全)
2012/05/10 PHP
分割GBK中文遭遇乱码的解决方法
2013/08/09 PHP
PHP中使用SimpleXML检查XML文件结构实例
2015/01/07 PHP
Yii2设置默认控制器的两种方法
2017/05/19 PHP
jQuery在线选座位插件seat-charts特效代码分享
2015/08/27 Javascript
JS常用函数和常用技巧小结
2016/10/15 Javascript
基于angularJS的表单验证指令介绍
2016/10/21 Javascript
sea.js常用的api简易文档
2016/11/15 Javascript
利用JavaScript在网页实现八数码启发式A*算法动画效果
2017/04/16 Javascript
对vue 键盘回车事件的实例讲解
2018/08/25 Javascript
JS实现方形抽奖效果
2018/08/27 Javascript
Vue插值、表达式、分隔符、指令知识小结
2018/10/12 Javascript
详解微信小程序-扫一扫 wx.scanCode() 扫码大变身
2019/04/30 Javascript
vue axios重复点击取消上一次请求封装的方法
2019/06/19 Javascript
让你30分钟快速掌握vue3教程
2020/10/26 Javascript
[10:34]DOTA2上海特级锦标赛全纪录
2016/03/25 DOTA
pycharm修改文件的默认打开方式的步骤
2019/07/29 Python
python 模拟贷款卡号生成规则过程解析
2019/08/30 Python
django filter过滤器实现显示某个类型指定字段不同值方式
2020/07/16 Python
Python如何合并多个字典或映射
2020/07/24 Python
HTML5 标准将把互联网视频扔回到黑暗时代
2010/02/10 HTML / CSS
用html5的canvas和JavaScript创建一个绘图程序的简单实例
2016/07/06 HTML / CSS
移动端开发HTML5页面点击按钮后出现闪烁或黑色背景的解决办法
2018/09/19 HTML / CSS
Agoda西班牙:全球特价酒店预订
2017/06/03 全球购物
实习期自我鉴定
2013/10/11 职场文书
安全检查与奖惩制度
2014/01/23 职场文书
爱心捐书活动总结
2014/07/05 职场文书
电子工程求职信
2014/07/17 职场文书
科技工作者先进事迹
2014/08/16 职场文书
教师批评与自我批评(群众路线)
2014/10/15 职场文书
2014流动人口计划生育工作总结
2014/12/20 职场文书
2015年乡镇发展党员工作总结
2015/03/31 职场文书
2016开学第一课心得体会
2016/01/23 职场文书
Python实现灰色关联分析与结果可视化的详细代码
2022/03/25 Python
Python使用Opencv打开笔记本电脑摄像头报错解问题及解决
2022/06/21 Python