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 相关文章推荐
Windows10下安装MySQL8
Apr 06 MySQL
.Net Core导入千万级数据至Mysql的步骤
May 24 MySQL
MySQL单表千万级数据处理的思路分享
Jun 05 MySQL
解决mysql模糊查询索引失效问题的几种方法
Jun 18 MySQL
Mysql8.0递归查询的简单用法示例
Aug 04 MySQL
MySQL实例精讲单行函数以及字符数学日期流程控制
Oct 15 MySQL
mysql中int(3)和int(10)的数值范围是否相同
Oct 16 MySQL
MySQL对数据表已有表进行分区表的实现
Nov 01 MySQL
MySQL之select、distinct、limit的使用
Nov 11 MySQL
mysql中如何用命令创建联合唯一索引
Apr 20 MySQL
MySql数据库 查询时间序列间隔
May 11 MySQL
MySQL详解进行JDBC编程与增删改查方法
Jun 16 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
zend framework配置操作数据库实例分析
2012/12/06 PHP
PHP 常用时间函数资料整理
2016/10/22 PHP
PHP对象的浅复制与深复制的实例详解
2017/10/26 PHP
javascript控制frame,iframe的src属性代码
2009/12/31 Javascript
20款超赞的jQuery插件 Web开发人员必备
2011/02/26 Javascript
jQuery jcrop插件截图使用方法
2013/11/20 Javascript
网站繁简切换的JS遇到页面卡死的解决方法
2014/03/12 Javascript
JS获取随机数函数可自定义最小值最大值
2014/05/08 Javascript
获取中文字符串的实际长度代码
2014/06/05 Javascript
JavaScript中变量声明有var和没var的区别示例介绍
2014/09/15 Javascript
JavaScript 浏览器对象模型BOM使用介绍
2015/04/13 Javascript
JavaScript实现网页对象拖放功能的方法
2015/04/15 Javascript
JS/Jquery判断对象为空的方法
2015/06/11 Javascript
用JavaScript显示浏览器客户端信息的超相近教程
2015/06/18 Javascript
详解Bootstrap glyphicons字体图标
2016/01/04 Javascript
JS控制文本域只读或可写属性的方法
2016/06/24 Javascript
浅谈js的ajax的异步和同步请求的问题
2016/10/07 Javascript
js入门之Function函数的使用方法【新手必看】
2016/11/22 Javascript
BootStrap中关于Select下拉框选择触发事件及扩展
2016/11/22 Javascript
详解关于react-redux中的connect用法介绍及原理解析
2017/09/11 Javascript
详解React 的几种条件渲染以及选择
2018/10/23 Javascript
JSON的parse()方法介绍
2019/01/31 Javascript
node获取客户端ip功能简单示例
2019/08/24 Javascript
Vue.js如何使用Socket.IO的示例代码
2019/09/05 Javascript
Python实现两个list求交集,并集,差集的方法示例
2018/08/02 Python
详解python中*号的用法
2019/10/21 Python
Python pytesseract验证码识别库用法解析
2020/06/29 Python
购买限量版收藏品、珠宝和礼品:Bradford Exchange
2016/09/23 全球购物
甜品店创业计划书
2014/08/14 职场文书
倡议书格式
2014/08/30 职场文书
2015入党自荐书范文
2015/03/05 职场文书
《穷人》教学反思
2016/02/19 职场文书
解决jupyter notebook启动后没有token的坑
2021/04/24 Python
python开发实时可视化仪表盘的示例
2021/05/07 Python
go使用Gin框架利用阿里云实现短信验证码功能
2021/08/04 Golang
Java 超详细讲解设计模式之中的抽象工厂模式
2022/03/25 Java/Android