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 使用SQL语句修改表名的实现
Apr 07 MySQL
详解MySQL事务的隔离级别与MVCC
Apr 22 MySQL
解读MySQL的客户端和服务端协议
May 10 MySQL
MySQL里面的子查询的基本使用
Aug 02 MySQL
SQL注入详解及防范方法
Dec 06 MySQL
mysql自增长id用完了该怎么办
Feb 12 MySQL
面试中老生常谈的MySQL问答集锦夯实基础
Mar 13 MySQL
pt-archiver 主键自增
Apr 26 MySQL
MySQL 字符集 character
May 04 MySQL
MySQL数据库如何查看表占用空间大小
Jun 10 MySQL
MySQL存储过程及语法详解
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
PHP中替换换行符的几种方法小结
2012/10/15 PHP
PHP读取xml方法介绍
2013/01/12 PHP
php文件服务实现虚拟挂载其他目录示例
2014/04/17 PHP
WordPress中用于检索模版的相关PHP函数使用解析
2015/12/15 PHP
WordPress伪静态规则设置代码实例
2020/12/10 PHP
重构Javascript代码示例(重构前后对比)
2013/01/23 Javascript
jQuery动态添加删除select项(实现代码)
2013/09/03 Javascript
JavaScript instanceof 的使用方法示例介绍
2013/10/23 Javascript
解析jquery中的ajax缓存问题
2013/12/19 Javascript
javascript中普通函数的使用介绍
2013/12/19 Javascript
在每个匹配元素的外部插入新元素的方法
2013/12/20 Javascript
Jquery easyUI 更新行示例
2014/03/06 Javascript
将字符串中由空格隔开的每个单词首字母大写
2014/04/06 Javascript
JS获取浏览器语言动态加载JS文件示例代码
2014/10/31 Javascript
JavaScript DOM基础
2015/04/13 Javascript
jQuery实现的漂亮表单效果代码
2015/08/18 Javascript
基于javascript html5实现多文件上传
2016/03/03 Javascript
JS中的事件委托实例浅析
2018/03/22 Javascript
JavaScript实现构造json数组的方法分析
2018/08/17 Javascript
vue踩坑记录之数组定义和赋值问题
2019/03/20 Javascript
关于在LayUI中使用AJAX提交巨坑记录
2019/10/25 Javascript
JavaScript 自定义html元素鼠标右键菜单功能
2019/12/02 Javascript
[01:14:19]NAVI vs Mineski 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
python中使用sys模板和logging模块获取行号和函数名的方法
2014/04/15 Python
python实现得到一个给定类的虚函数
2014/09/28 Python
Tensorflow环境搭建的方法步骤
2018/02/07 Python
python读取文件名称生成list的方法
2018/04/27 Python
python代码如何实现余弦相似性计算
2020/02/09 Python
Fanatics英国官网:美国体育电商
2018/11/06 全球购物
理工学院学生自我鉴定
2014/02/23 职场文书
质量标语大全
2014/06/12 职场文书
环卫处个人工作总结
2015/03/04 职场文书
2016党员干部反腐倡廉心得体会
2016/01/13 职场文书
股东出资协议书
2016/03/21 职场文书
pytorch查看网络参数显存占用量等操作
2021/05/12 Python
SpringRetry重试框架的具体使用
2021/07/25 Java/Android