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 相关文章推荐
数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)
Apr 05 MySQL
MySql新手入门的基本操作汇总
May 13 MySQL
MySQL 逻辑备份与恢复测试的相关总结
May 14 MySQL
新手入门Mysql--概念
Jun 18 MySQL
MySQL基于索引的压力测试的实现
Nov 07 MySQL
MySQL之MyISAM存储引擎的非聚簇索引详解
Mar 03 MySQL
数据分析数据库ClickHouse在大数据领域应用实践
Apr 03 MySQL
sql查询语句之平均分、最高最低分及排序语句
May 30 MySQL
MySQL的表级锁,行级锁,排它锁和共享锁
Jul 15 MySQL
数据设计之权限的实现
Aug 05 MySQL
MySQL 原理与优化之Limit 查询优化
Aug 14 MySQL
mysql数据库如何转移到oracle
Dec 24 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
第七节--类的静态成员
2006/11/16 PHP
POSIX 风格和兼容 Perl 风格两种正则表达式主要函数的类比(preg_match, preg_replace, ereg, ereg_replace)
2010/10/12 PHP
php日期转时间戳,指定日期转换成时间戳
2012/07/17 PHP
PHP判断一个字符串是否是回文字符串的方法
2015/03/23 PHP
php 把数字转换成汉字的代码
2015/07/21 PHP
如何修改yii2.0自带的user表为其它的表
2017/08/01 PHP
thinkphp5 模型实例化获得数据对象的教程
2019/10/18 PHP
谈谈关于JavaScript 中的 MVC 模式
2013/04/11 Javascript
JS实现的自定义网页拖动类
2015/11/06 Javascript
javascript移动开发中touch触摸事件详解
2016/03/18 Javascript
jQuery+ajax读取并解析XML文件的方法
2016/09/09 Javascript
利用js编写响应式侧边栏
2016/09/17 Javascript
微信小程序 实现tabs选项卡效果实例代码
2016/10/31 Javascript
JavaScript同源策略和跨域访问实例详解
2018/04/03 Javascript
jQuery简单实现的HTML页面文本框模糊匹配查询功能完整示例
2018/05/09 jQuery
纯异步nodejs文件夹(目录)复制功能
2019/09/03 NodeJs
解决Echarts 显示隐藏后宽度高度变小的问题
2020/07/19 Javascript
vue路由结构可设一层方便动态添加路由操作
2020/08/31 Javascript
Python的动态重新封装的教程
2015/04/11 Python
python从入门到精通(DAY 1)
2015/12/20 Python
Pytorch中实现只导入部分模型参数的方式
2020/01/02 Python
解决更改AUTH_USER_MODEL后出现的问题
2020/05/14 Python
Win10环境中如何实现python2和python3并存
2020/07/20 Python
python绘制高斯曲线
2021/02/19 Python
前台接待员岗位职责
2014/01/02 职场文书
生物制药自我鉴定
2014/01/25 职场文书
《学会合作》教学反思
2014/04/12 职场文书
社会实践先进工作者事迹材料
2014/05/06 职场文书
历史学专业求职信
2014/06/19 职场文书
移交协议书
2014/08/19 职场文书
教育见习报告范文
2014/11/03 职场文书
2014年保洁工作总结
2014/11/24 职场文书
廉洁自律个人总结
2015/02/14 职场文书
自荐信格式模板
2015/03/27 职场文书
青年干部培训班学习心得体会
2016/01/06 职场文书
用 Python 元类的特性实现 ORM 框架
2021/05/19 Python