当前位置:网站首页>MySQL 原理与优化:Update 优化
MySQL 原理与优化:Update 优化
2022-08-10 18:12:00 【51CTO】

谈到Update 语句大家可能不会陌生,很多情况下我们都会使用它来更新table中的记录。一般而言我们会使用innodb 的存储引擎,innodb引擎是基于行锁的,具体一点说是针对索引来加锁的(保证锁不能失效),并不是针对记录加锁,如果对于没有建立索引的字段进行过滤操作,从而执行update 的话,会导致表锁 。
今天就看看在使用innodb的时候如何使用update 语句。
已经存在course 表,其内容如下:

目前该表没有加任何的索引,默认情况下id 是表的索引。
接着让我们分别开启两个事务(两个客户端),分别执行下述指令。
开启第一个事务
begin;
update course set name = 'Java' where id = 1;

开启另外一个事务
begin;
update course set name = 'Spark' where id = 4;

两个事务都可以执行,然后再分别执行两个事务的 commit 操作,就可以看到更新的结果。

两个事务能够并行执行的条件是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之后,释放掉表锁,第二个事务才能继续执行。

为了让两个事务能够并行执行,我们将name 加入到course 的索引中去。
create index index_name on course(name);
show index from course;

接着再执行刚才的两个事务,这两个事务分别对不同的记录进行更新,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 条件的情况下,条件字段是索引的情况可以提升更新的效率,避免锁表的情况发生。
边栏推荐
猜你喜欢
![[Image dehazing] Image dehazing based on color attenuation prior with matlab code](/img/ae/d6d36671804fadae548464496f28d6.png)
[Image dehazing] Image dehazing based on color attenuation prior with matlab code

Wuling Hongguang MINI EV, the only drawback is safety

接口测试进阶接口脚本使用—apipost(预/后执行脚本)

WebRTC source code analysis nack detailed explanation

「NewSQL技术」Greenplum 6中的OLTP负载性能提升60倍以上

Toronto Research Chemicals霉菌毒素分析丨伏马菌素B2

「业务架构」业务能力的热图是什么,有啥用?

H3C_堆叠(IRF)及链路聚合在项目中的综合应用

「Web应用架构」轮询,SSE 和WebSocket,如何选择合适的?

从Delta 2.0开始聊聊我们需要怎样的数据湖
随机推荐
机器人控制器编程实践指导书旧版-实践八 机器人综合设计
MySql主要性能指标说明
Thoughts on Technology Sharing
CSV(Comma-Separate-Values)逗号分隔值文件
【FAQ】【Push Kit】推送服务,回执配置一直报错、回执过期修改、怎么删除配置的回执
ZLMediaKit 服务器源码解读---RTSP推流拉流
让mixin为项目开发助力【及递归优化新尝试】
Wuling Hongguang MINI EV, the only drawback is safety
Selenium - 如何使用隐式、显示、强制元素等待?
Toronto Research Chemicals 对乙酰氧基苯乙酮说明书
6-10 二分查找(20分)
EasyGBS连接mysql数据库提示“can’t connect to mysql server”,如何解决?
Product Description丨MobPush fast integration method on Android side
pyspark列合并为一行
【快应用】实现自定义导航栏组件
【图像分割】基于元胞自动机实现图像分割附matlab代码
c语言进阶篇:柔性数组
Toronto Research Chemicals萜烯分析丨反式植物醇
机器人控制器编程实践指导书旧版-实践七 无线通信(网络)
postgis空间数据导入及可视化