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 05 MySQL
MySQL 覆盖索引的优点
May 19 MySQL
MySql存储过程之逻辑判断和条件控制
May 26 MySQL
新手入门Mysql--概念
Jun 18 MySQL
MySQL 使用索引扫描进行排序
Jun 20 MySQL
Mysql中where与on的区别及何时使用详析
Aug 04 MySQL
MySQL 如何限制一张表的记录数
Sep 14 MySQL
MySQL利用UNION连接2个查询排序失效详解
Nov 20 MySQL
浅谈redis的过期时间设置和过期删除机制
Mar 18 MySQL
mysql 体系结构和存储引擎介绍
May 06 MySQL
MySQL 原理与优化之Limit 查询优化
Aug 14 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
德生S2000电路分析
2021/03/02 无线电
PHP递归调用的小技巧讲解
2013/02/19 PHP
PHP执行批量mysql语句的解决方法
2013/05/02 PHP
PHP中生成UUID自定义函数分享
2015/06/10 PHP
PHP parse_ini_file函数的应用与扩展操作示例
2019/01/07 PHP
实现laravel 插入操作日志到数据库的方法
2019/10/11 PHP
JavaScript 异步方法队列链实现代码分析
2010/06/05 Javascript
JavaScript的类型简单说明
2010/09/03 Javascript
JS保留两位小数,多位小数的示例代码
2014/01/07 Javascript
JavaScript随机生成信用卡卡号的方法
2015/04/07 Javascript
基于javascript实现彩票随机数生成(简单版)
2020/04/17 Javascript
使用Vue.js创建一个时间跟踪的单页应用
2016/11/28 Javascript
xmlplus组件设计系列之路由(ViewStack)(7)
2017/05/02 Javascript
解决vue中使用swiper插件问题及swiper在vue中的用法
2018/04/04 Javascript
详解vue使用$http服务端收不到参数
2019/04/19 Javascript
微信小程序 弹窗输入组件的实现解析
2019/08/12 Javascript
JS代码触发事件代码实例
2020/01/02 Javascript
vue监听dom大小改变案例
2020/07/29 Javascript
[01:28]一分钟告诉你DOTA2 TI9不朽宝藏Ⅱ中有什么!
2019/07/09 DOTA
Python3 Random模块代码详解
2017/12/04 Python
PyCharm配置mongo插件的方法
2018/11/30 Python
PyQt5+requests实现车票查询工具
2019/01/21 Python
python 中的paramiko模块简介及安装过程
2020/02/29 Python
Python安装OpenCV的示例代码
2020/03/05 Python
详解pytorch tensor和ndarray转换相关总结
2020/09/03 Python
python调用摄像头的示例代码
2020/09/28 Python
html5组织文档结构_动力节点Java学院整理
2017/07/11 HTML / CSS
比利时的在线灯具店:Lampen24.be
2019/07/01 全球购物
毕业生自我推荐
2013/11/04 职场文书
白莲教口号
2014/06/18 职场文书
安全先进个人材料
2014/12/29 职场文书
家庭经济困难证明
2015/06/23 职场文书
html+css 实现简易导航栏功能
2021/04/07 HTML / CSS
HTML基本元素标签介绍
2022/02/28 HTML / CSS
windows server2008 开启端口的实现方法
2022/06/25 Servers
SqlServer常用函数及时间处理小结
2023/05/08 SQL Server