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基础(二)
Apr 05 MySQL
MySQL pt-slave-restart工具的使用简介
Apr 07 MySQL
详解MySQL InnoDB存储引擎的内存管理
Apr 08 MySQL
MySQL时间盲注的五种延时方法实现
May 18 MySQL
MySQL之PXC集群搭建的方法步骤
May 25 MySQL
为什么MySQL分页用limit会越来越慢
Jul 25 MySQL
SQL实现LeetCode(177.第N高薪水)
Aug 04 MySQL
MySQL七种JOIN类型小结
Oct 24 MySQL
如何创建一个创建MySQL数据库中的datetime类型
Mar 21 MySQL
MySQL 执行数据库更新update操作的时候数据库卡死了
May 02 MySQL
MySQL的prepare使用以及遇到的bug
May 11 MySQL
mysql拆分字符串作为查询条件的示例代码
Jul 07 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
农民C键的运用技巧
2020/03/04 星际争霸
将博客园(cnblogs.com)数据导入到wordpress的代码
2013/01/06 PHP
php生成图形(Libchart)实例
2013/11/06 PHP
PHP 之 写时复制介绍(Copy On Write)
2014/05/13 PHP
PHP读取RSS(Feed)简单实例
2014/06/12 PHP
php 常用的系统函数
2017/02/07 PHP
JavaScript Event学习第八章 事件的顺序
2010/02/07 Javascript
myFocus slide3D v1.1.0 使用方法与下载
2011/01/12 Javascript
JS 精确统计网站访问量的实例代码
2013/07/05 Javascript
详解jquery uploadify 上传文件
2013/11/09 Javascript
ActiveX控件与Javascript之间的交互示例
2014/06/04 Javascript
JavaScript使用DeviceOne开发实战(一) 配置和起步
2015/12/01 Javascript
详解AngularJS中ng-src指令的使用
2016/09/07 Javascript
微信小程序实现给嵌套template模板传递数据的方式总结
2017/12/18 Javascript
JS/HTML5游戏常用算法之碰撞检测 地图格子算法实例详解
2018/12/12 Javascript
使用 webpack 插件自动生成 vue 路由文件的方法
2019/08/20 Javascript
微信小程序实现时间进度条功能
2020/11/17 Javascript
python机器学习实战之最近邻kNN分类器
2017/12/20 Python
Python minidom模块用法示例【DOM写入和解析XML】
2019/03/25 Python
Python+Pyqt实现简单GUI电子时钟
2021/02/22 Python
python自定义时钟类、定时任务类
2021/02/22 Python
浅析Python+OpenCV使用摄像头追踪人脸面部血液变化实现脉搏评估
2019/10/17 Python
Python concurrent.futures模块使用实例
2019/12/24 Python
在python image 中实现安装中文字体
2020/05/16 Python
python爬虫使用正则爬取网站的实现
2020/08/03 Python
美国大码时尚女装购物网站:ELOQUII
2017/12/28 全球购物
新加坡鲜花速递/新加坡网上花店:Ferns N Petals
2020/08/29 全球购物
Oracle性能调优原则
2012/05/03 面试题
毕业生怎样写好自荐信
2013/11/11 职场文书
新学期开学寄语
2014/01/18 职场文书
《真想变成大大的荷叶》教学反思
2014/04/14 职场文书
个人委托书如何写
2014/09/25 职场文书
超市工作总结范文2014
2014/12/19 职场文书
社区活动总结
2015/02/04 职场文书
导游词之吉林花园山
2019/10/17 职场文书
Python通过loop.run_in_executor执行同步代码 同步变为异步
2022/04/11 Python