MySQL 原理与优化之Update 优化

作者:51CTO崔皓??????? 时间:2024-01-17 03:03:35 

前言:

谈到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 条件的情况下,条件字段是索引的情况可以提升更新的效率,避免锁表的情况发生。

来源:https://blog.51cto.com/u_14279308/5563605

标签:MySQL,Update,优化
0
投稿

猜你喜欢

  • selenium+python实现文件上传操作的方法实例

    2022-05-06 13:21:49
  • 详解Python中的循环语句的用法

    2023-10-26 08:37:35
  • python快速排序的实现及运行时间比较

    2022-11-30 20:41:27
  • Python绘图模块 turtle案例代码

    2022-12-16 01:28:10
  • css实现图片倒影效果

    2007-11-05 18:29:00
  • CSS3属性box-shadow图层阴影效果使用教程

    2010-05-16 14:54:00
  • java连接Access数据库的方法

    2024-01-14 13:41:17
  • python轻松查到删除自己的微信好友

    2021-06-06 12:31:44
  • python中_del_还原数据的方法

    2022-07-28 18:49:14
  • python进阶_浅谈面向对象进阶

    2022-01-22 17:02:06
  • 很全面的Mysql数据库、数据库表、数据基础操作笔记(含代码)

    2024-01-15 11:19:42
  • Tensorflow卷积实现原理+手写python代码实现卷积教程

    2021-12-21 20:12:52
  • Python使用tkinter模块实现推箱子游戏

    2022-12-06 08:27:49
  • PHP登录(ajax提交数据和后台校验)实例分享

    2024-04-28 09:43:41
  • oracle 集合

    2024-01-21 23:56:49
  • mysql创建Bitmap_Join_Indexes中的约束与索引

    2024-01-15 18:25:50
  • 分析经典Python开发工程师面试题

    2022-03-17 01:33:37
  • python实现批量修改图片格式和尺寸

    2021-02-12 10:47:35
  • SQL学习笔记七函数 数字,日期,类型转换,空值处理,case

    2011-09-30 11:48:25
  • Python选择网卡发包及接收数据包

    2021-10-13 12:02:10
  • asp之家 网络编程 m.aspxhome.com