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字段要使用NOT NULL
May 13 MySQL
分析MySQL抛出异常的几种常见解决方式
May 18 MySQL
MySQL之PXC集群搭建的方法步骤
May 25 MySQL
SQL实现LeetCode(176.第二高薪水)
Aug 04 MySQL
SQL实现LeetCode(177.第N高薪水)
Aug 04 MySQL
MySQL中IO问题的深入分析与优化
Apr 02 MySQL
mysql中如何用命令创建联合唯一索引
Apr 20 MySQL
mysql实现将字符串字段转为数字排序或比大小
Jun 14 MySQL
DQL数据查询语句使用示例
Dec 24 MySQL
MySQL数据管理操作示例讲解
Dec 24 MySQL
SQL中去除重复数据的几种方法汇总(窗口函数对数据去重)
May 08 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
全国FM电台频率大全 - 3 河北省
2020/03/11 无线电
php中防止恶意刷新页面的代码小结
2012/10/31 PHP
php遍历类中包含的所有元素的方法
2015/05/12 PHP
PHP识别二维码的方法(php-zbarcode安装与使用)
2016/07/07 PHP
Prototype 学习 工具函数学习($w,$F方法)
2009/07/12 Javascript
jQuery 表格工具集
2010/04/25 Javascript
firefox事件处理之自动查找event的函数(用于onclick=foo())
2010/08/05 Javascript
如何让easyui gridview 宽度自适应窗口改变及fitColumns应用
2013/01/25 Javascript
JavaScript中函数(Function)的apply与call理解
2015/07/08 Javascript
jQuery跨域问题解决方案
2015/08/03 Javascript
关于动态生成dom绑定事件失效的原因及解决方法
2016/08/06 Javascript
Angular移动端页面input无法输入的解决方法
2017/11/14 Javascript
React Native react-navigation 导航使用详解
2017/12/01 Javascript
详解用Node.js写一个简单的命令行工具
2018/03/01 Javascript
M2实现Nodejs项目自动部署的方法步骤
2019/05/05 NodeJs
JS左右无缝轮播功能完整实例
2019/05/16 Javascript
微信小程序 调用远程接口 给全局数组赋值代码实例
2019/08/13 Javascript
多个vue子路由文件自动化合并的方法
2019/09/03 Javascript
js+css实现扇形导航效果
2020/08/18 Javascript
[01:10]DOTA2次级职业联赛 - Fly战队宣传片
2014/12/01 DOTA
[01:03:13]VG vs Pain 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
浅谈python socket函数中,send与sendall的区别与使用方法
2017/05/09 Python
python Spyder界面无法打开的解决方法
2018/04/27 Python
Pandas 数据处理,数据清洗详解
2018/07/10 Python
python实现旋转和水平翻转的方法
2018/10/25 Python
python获取网络图片方法及整理过程详解
2019/12/20 Python
Python实现汇率转换操作
2020/05/03 Python
用python绘制樱花树
2020/10/09 Python
HTML5 图片悬停放大的实现代码示例
2019/12/04 HTML / CSS
德国箱包网上商店:koffer24.de
2016/07/27 全球购物
科颜氏英国官网:Kiehl’s英国
2019/11/20 全球购物
应届优秀本科大学毕业生自我鉴定
2014/01/21 职场文书
市政管理求职信范文
2014/05/07 职场文书
个人务虚会发言材料
2014/10/20 职场文书
pandas进行数据输入和输出的方法详解
2022/03/23 Python
MySQL创建表操作命令分享
2022/03/25 MySQL