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 角色(role)功能介绍
Apr 24 MySQL
MySQL触发器的使用
May 24 MySQL
Mysql 如何查询时间段交集
Jun 08 MySQL
解决mysql模糊查询索引失效问题的几种方法
Jun 18 MySQL
MySQL8.0.18配置多主一从
Jun 21 MySQL
SQL实现LeetCode(177.第N高薪水)
Aug 04 MySQL
MySQL Innodb索引机制详细介绍
Nov 23 MySQL
一文弄懂MySQL索引创建原则
Feb 28 MySQL
MySQL七大JOIN的具体使用
Feb 28 MySQL
MySQL学习必备条件查询数据
Mar 25 MySQL
浅谈MySql update会锁定哪些范围的数据
Jun 25 MySQL
前端传参数进行Mybatis调用mysql存储过程执行返回值详解
Aug 14 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
Adodb的十个实例(清晰版)
2006/12/31 PHP
Codeigniter注册登录代码示例
2014/06/12 PHP
Laravel框架数据库CURD操作、连贯操作总结
2014/09/03 PHP
Thinkphp 框架扩展之Widget扩展实现方法分析
2020/04/23 PHP
Javascript在IE或Firefox下获取鼠标位置的代码
2009/12/18 Javascript
javascript入门基础之私有变量
2010/02/23 Javascript
javascript获取url上某个参数的方法
2013/11/08 Javascript
Javascript 绘制 sin 曲线过程附图
2014/08/21 Javascript
JavaScript中的函数声明和函数表达式区别浅析
2015/03/27 Javascript
深入理解Angularjs中的$resource服务
2016/12/31 Javascript
ajax请求data遇到的问题分析
2018/01/18 Javascript
解决Linux无法正常安装与卸载Node.js的方法
2018/01/19 Javascript
详解redis在nodejs中的应用
2018/05/02 NodeJs
详解vue中axios的封装
2018/07/18 Javascript
ES10的13个新特性示例(小结)
2019/09/23 Javascript
解决VUE 在IE下出现ReferenceError: Promise未定义的问题
2020/11/07 Javascript
Vue 组件注册全解析
2020/12/17 Vue.js
[01:52]深扒TI7聊天轮盘语音出处7
2017/05/11 DOTA
python下setuptools的安装详解及No module named setuptools的解决方法
2017/07/06 Python
python 系统调用的实例详解
2017/07/11 Python
代码讲解Python对Windows服务进行监控
2018/02/11 Python
Python实现Dijkstra算法
2018/10/17 Python
Python图像处理之图像的缩放、旋转与翻转实现方法示例
2019/01/04 Python
Python实现html转换为pdf报告(生成pdf报告)功能示例
2019/05/04 Python
Python操作word文档插入图片和表格的实例演示
2020/10/25 Python
python中pop()函数的语法与实例
2020/12/01 Python
奥地利汽车配件店:Pkwteile.at
2017/03/10 全球购物
KARATOV珠宝在线商店:俄罗斯珠宝品牌
2019/03/13 全球购物
师范毕业生个人求职信
2013/12/09 职场文书
经贸日语专业个人求职信范文
2013/12/28 职场文书
优良学风班总结材料
2014/02/08 职场文书
企业授权委托书范本
2014/04/02 职场文书
《真想变成大大的荷叶》教学反思
2014/04/14 职场文书
学习张丽丽心得体会
2014/09/03 职场文书
创卫工作总结2015
2015/04/22 职场文书
如何在Python中创建二叉树
2021/03/30 Python