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 27 MySQL
MySQL 常见存储引擎的优劣
Jun 02 MySQL
一次MySQL启动导致的事故实战记录
Sep 15 MySQL
MySQL数据库10秒内插入百万条数据的实现
Nov 01 MySQL
MySQL和Oracle批量插入SQL的通用写法示例
Nov 17 MySQL
优化Mysql查询的示例
Apr 26 MySQL
Mysql 一主多从的部署
May 20 MySQL
mysql5.5中文乱码问题解决的有用方法
May 30 MySQL
MySQL事务的ACID特性以及并发问题方案
Jul 15 MySQL
SQLServer常见数学函数梳理总结
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
在Linux系统的服务器上隐藏PHP版本号的方法
2015/06/06 PHP
php通过淘宝API查询IP地址归属等信息
2015/12/25 PHP
PHP用FTP类上传文件视频等的简单实现方法
2016/09/23 PHP
js 学习笔记(三)
2009/12/29 Javascript
javascript Array.prototype.slice使用说明
2010/10/11 Javascript
定时器(setTimeout/setInterval)调用带参函数失效解决方法
2013/03/26 Javascript
父节点获取子节点的字符串示例代码
2014/02/26 Javascript
jQuery prototype冲突的2种解决方法(附demo示例下载)
2016/01/21 Javascript
Node.js实用代码段之正确拼接Buffer
2016/03/17 Javascript
JS当前页面登录注册框,固定DIV,底层阴影的实例代码
2016/09/29 Javascript
JS实现超简单的汉字转拼音功能示例
2016/12/22 Javascript
bootstrap fileinput插件实现预览上传照片功能
2018/01/23 Javascript
vue移动端实现下拉刷新
2018/04/22 Javascript
Js经典案例的实例代码
2018/05/10 Javascript
webpack+vue-cil中proxyTable处理跨域的方法
2018/07/20 Javascript
es6函数之严格模式用法实例分析
2020/03/17 Javascript
微信小程序订阅消息(java后端实现)开发
2020/06/01 Javascript
js实现3D旋转相册
2020/08/02 Javascript
解决idea开发遇到javascript动态添加html元素时中文乱码的问题
2020/09/29 Javascript
[01:13]这,就是刀塔
2014/07/16 DOTA
[47:12]TFT vs Secret Supermajor小组赛C组 BO3 第三场 6.3
2018/06/04 DOTA
Python中文字符串截取问题
2015/06/15 Python
浅谈python中的数字类型与处理工具
2017/08/02 Python
linux环境下的python安装过程图解(含setuptools)
2017/11/22 Python
Python3.5内置模块之os模块、sys模块、shutil模块用法实例分析
2019/04/27 Python
Django框架设置cookies与获取cookies操作详解
2019/05/27 Python
Python中的类与类型示例详解
2019/07/10 Python
python excel多行合并的方法
2020/12/09 Python
有关HTML5中背景音乐的自动播放功能
2017/10/16 HTML / CSS
Perfume’s Club法国站:购买香水和化妆品
2019/05/02 全球购物
土木工程专业自荐信
2013/10/04 职场文书
电大毕业生自我鉴定
2014/04/10 职场文书
2014年员工工作总结范文
2014/11/18 职场文书
2014年劳动部工作总结
2014/12/11 职场文书
捐书仪式主持词
2015/07/04 职场文书
详解MySQL 用户权限管理
2021/04/20 MySQL