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中出现乱码问题的终极解决宝典
May 26 MySQL
Mysql数据库索引面试题(程序员基础技能)
May 31 MySQL
mysql5.7使用binlog 恢复数据的方法
Jun 03 MySQL
浅谈mysql返回Boolean类型的几种情况
Jun 04 MySQL
详细谈谈MYSQL中的COLLATE是什么
Jun 11 MySQL
详解MySQL多版本并发控制机制(MVCC)源码
Jun 23 MySQL
详细聊聊关于Mysql联合查询的那些事儿
Oct 24 MySQL
MySQL Innodb索引机制详细介绍
Nov 23 MySQL
SQL语法CONSTRAINT约束操作详情
Jan 18 MySQL
为什么MySQL不建议使用SELECT *
Apr 03 MySQL
Mysql索引失效 数据库表中有索引还是查询很慢
May 15 MySQL
MySQL存储过程及语法详解
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
神族 Protoss 剧情介绍
2020/03/14 星际争霸
「OVERLORD」动画重要删减!雅儿贝德的背叛?至尊猎杀队结成
2020/04/09 日漫
搜索和替换文件或目录的一个好类--很实用
2006/10/09 PHP
PHP执行linux系统命令的常用函数使用说明
2010/04/27 PHP
解析PHP中一些可能会被忽略的问题
2013/06/21 PHP
使用GDB调试PHP代码,解决PHP代码死循环问题
2015/03/02 PHP
jQuery用unbind方法去掉hover事件及其他方法介绍
2013/03/18 Javascript
鼠标放在图片上显示大图的JS代码
2013/03/26 Javascript
jquery动态添加删除一行数据示例
2014/06/12 Javascript
巧用canvas
2017/01/21 Javascript
微信小程序 scroll-view实现锚点滑动的示例
2017/12/06 Javascript
解决Vue-cli npm run build生产环境打包,本地不能打开的问题
2018/09/20 Javascript
微信小程序实现展示评分结果功能
2019/02/15 Javascript
详解Vue+Element的动态表单,动态表格(后端发送配置,前端动态生成)
2019/04/20 Javascript
React优化子组件render的使用
2019/05/12 Javascript
微信小程序接入vant Weapp组件的详细步骤
2020/10/28 Javascript
用python实现批量重命名文件的代码
2012/05/25 Python
python去除所有html标签的方法
2015/05/05 Python
浅谈python内置变量-reversed(seq)
2017/06/21 Python
Python简单计算数组元素平均值的方法示例
2017/12/26 Python
python 读txt文件,按‘,’分割每行数据操作
2020/07/05 Python
沪江旗下的海量优质课程平台:沪江网校
2017/11/07 全球购物
德国户外装备、登山运动和攀岩商店:tapir store
2020/02/12 全球购物
求职信写作要突出重点
2014/01/01 职场文书
物理专业本科生自荐信
2014/01/30 职场文书
《挑山工》的教学反思
2014/02/16 职场文书
小学学雷锋活动总结
2014/04/25 职场文书
纪检干部个人对照检查材料
2014/09/23 职场文书
机关作风建设工作总结
2014/10/23 职场文书
离婚协议书的范本
2015/01/27 职场文书
2015年质量管理工作总结范文
2015/05/18 职场文书
2015暑假假期总结
2015/07/13 职场文书
导游词之天津古文化街
2019/11/09 职场文书
python实现批量移动文件
2021/04/05 Python
晶体管来复再生式二管收音机
2021/04/22 无线电
正则表达式基础与常用验证表达式
2022/06/16 Javascript