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 COUNT函数的使用与优化
May 10 MySQL
MySQL 覆盖索引的优点
May 19 MySQL
mysql 数据插入优化方法之concurrent_insert
Jul 01 MySQL
浅谈MySQL函数
Oct 05 MySQL
SpringBoot连接MySQL获取数据写后端接口的操作方法
Nov 02 MySQL
浅谈MySql整型索引和字符串索引失效或隐式转换问题
Nov 20 MySQL
Windows 64位 安装 mysql 8.0.28 图文教程
Apr 19 MySQL
MySQL 数据库范式化设计理论
Apr 22 MySQL
Mysql中常用的join连接方式
May 11 MySQL
MySQL 逻辑备份 into outfile
May 15 MySQL
mysql5.5中文乱码问题解决的有用方法
May 30 MySQL
MySQL count(*)统计总数问题汇总
Sep 23 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
解决163/sohu/sina不能够收到PHP MAIL函数发出邮件的问题
2009/03/13 PHP
php使用smtp发送支持附件的邮件示例
2014/04/13 PHP
Yii框架学习笔记之session与cookie简单操作示例
2019/04/30 PHP
Json和Jsonp理论实例代码详解
2013/11/15 Javascript
JS获取当前日期时间并定时刷新示例
2021/03/04 Javascript
深入分析JQuery和JavaScript的异同
2014/10/23 Javascript
js游戏人物上下左右跑步效果代码分享
2015/08/28 Javascript
理解javascript中的闭包
2017/01/11 Javascript
Vue进度条progressbar组件功能
2018/04/17 Javascript
element-ui中select组件绑定值改变,触发change事件方法
2018/08/24 Javascript
手淘flexible.js框架使用和源代码讲解小结
2018/10/15 Javascript
ES6入门教程之变量的解构赋值详解
2019/04/13 Javascript
微信小程序tab切换可滑动切换导航栏跟随滚动实现代码
2019/09/04 Javascript
Vue select 绑定动态变量的实例讲解
2020/10/22 Javascript
Python实现删除文件但保留指定文件
2015/06/21 Python
Python cookbook(数据结构与算法)实现优先级队列的方法示例
2018/02/18 Python
使用python进行广告点击率的预测的实现
2019/07/04 Python
Django ImageFiled上传照片并显示的方法
2019/07/28 Python
pip安装python库的方法总结
2019/08/02 Python
图解python全局变量与局部变量相关知识
2019/11/02 Python
python通过链接抓取网站详解
2019/11/20 Python
PyTorch加载自己的数据集实例详解
2020/03/18 Python
基于django和dropzone.js实现上传文件
2020/11/24 Python
无畏的旅行:Intrepid Travel
2017/12/20 全球购物
台湾母婴用品购物网站:Infant婴之房
2018/06/15 全球购物
廉政教育心得体会
2014/01/01 职场文书
父母对孩子说的话
2014/04/12 职场文书
高三上学期学习自我评价
2014/04/23 职场文书
大学生求职信
2014/06/17 职场文书
2015年招商引资工作总结
2015/04/25 职场文书
小学二年级语文教学反思
2016/03/03 职场文书
如何书写民事调解协议书?
2019/06/25 职场文书
PHP 技巧 * SVG 保存为图片(分享图生成)
2021/04/02 PHP
详细介绍Java中的CyclicBarrier
2022/04/13 Java/Android
python中使用redis用法详解
2022/12/24 Redis