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
仅用一句SQL更新整张表的涨跌幅、涨跌率的解决方案
May 06 MySQL
MySql 8.0及对应驱动包匹配的注意点说明
Jun 23 MySQL
ORM模型框架操作mysql数据库的方法
Jul 25 MySQL
Node-Red实现MySQL数据库连接的方法
Aug 07 MySQL
Mysql关于数据库是否应该使用外键约束详解说明
Oct 24 MySQL
记一次Mysql不走日期字段索引的原因小结
Oct 24 MySQL
一文简单了解MySQL前缀索引
Apr 03 MySQL
Innodb存储引擎中的后台线程详解
Apr 03 MySQL
sql查询语句之平均分、最高最低分及排序语句
May 30 MySQL
MySQL解决Navicat设置默认字符串时的报错问题
Jun 16 MySQL
MySQL约束(创建表时的各种条件说明)
Jun 21 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开源建站平台小结
2010/04/22 PHP
php注销代码(session注销)
2012/05/31 PHP
PHP判断一个gif图片是否为动态图片的方法
2014/11/19 PHP
PHP+jQuery+Ajax实现用户登录与退出
2015/04/27 PHP
php实现自定义中奖项数和概率的抽奖函数示例
2017/05/26 PHP
php 删除指定文件夹的实例讲解
2017/07/25 PHP
div当滚动到页面顶部的时候固定在顶部实例代码
2013/05/27 Javascript
JS获取客户端IP地址、MAC和主机名的7个方法汇总
2014/07/21 Javascript
JS实现可缩放、拖动、关闭和最小化的浮动窗口完整实例
2015/03/04 Javascript
JS控制表格实现一条光线流动分割行的方法
2015/03/09 Javascript
VUEJS实战之构建基础并渲染出列表(1)
2016/06/13 Javascript
JS焦点图,JS 多个页面放多个焦点图的实例
2016/12/08 Javascript
想用好React的你必须要知道的一些事情
2017/07/24 Javascript
深入理解Promise.all
2018/08/08 Javascript
一个因@click.stop引发的bug的解决
2019/01/08 Javascript
vue-cli3+typescript初体验小结
2019/02/28 Javascript
vue 解决data中定义图片相对路径页面不显示的问题
2020/08/13 Javascript
js实现简单抽奖功能
2020/11/24 Javascript
Vue使用Ref跨层级获取组件的步骤
2021/01/25 Vue.js
[03:00]《DAC最前线》之欧美新秀VS老将
2015/02/01 DOTA
[51:28]EG vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/16 DOTA
python cx_Oracle模块的安装和使用详细介绍
2017/02/13 Python
python assert的用处示例详解
2019/04/01 Python
Django连接数据库并实现读写分离过程解析
2019/11/13 Python
python文件操作seek()偏移量,读取指正到指定位置操作
2020/07/05 Python
浅谈Python 钉钉报警必备知识系统讲解
2020/08/17 Python
python图片合成的示例
2020/11/09 Python
世界领先的艺术图书出版社:TASCHEN
2018/07/23 全球购物
护理专科毕业推荐信
2013/11/10 职场文书
西式婚礼证婚词
2014/01/12 职场文书
婚礼主持结束词
2014/03/13 职场文书
关于感恩的演讲稿200字
2014/08/26 职场文书
党委班子纠正“四风”问题整改措施
2014/10/28 职场文书
朋友圈早安励志语录!
2019/07/08 职场文书
《飘》英文读后感五篇
2019/10/11 职场文书
详解Nginx启动失败的几种错误处理
2021/04/01 Servers