服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Mysql - MySQL 原理与优化之Update 优化

MySQL 原理与优化之Update 优化

2022-08-14 20:0551CTO崔皓​​​​​​​ Mysql

这篇文章主要介绍了MySQL 原理与优化之Update 优化,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下,希望对你的学习有所帮助

前言:

谈到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 优化内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文地址:https://blog.51cto.com/u_14279308/5563605

延伸 · 阅读

精彩推荐
  • MysqlMySQL索引下推详细

    MySQL索引下推详细

    这篇文章主要介绍MySQL索引下推,索引下推(ICP)是针对MySQL使用索引从表中检索数据行的情况的优化。下面就来介绍相关资料,需要的朋友可以参考一下...

    程序员巴士6562021-11-22
  • MysqlMySQL 利用frm文件和ibd文件恢复表数据

    MySQL 利用frm文件和ibd文件恢复表数据

    这篇文章主要介绍了MySQL 利用frm文件和ibd文件恢复表数据,帮助大家更好的理解和学习使用MySQL,感兴趣的朋友可以了解下...

    AsiaYe4492021-04-30
  • Mysql详细解读分布式锁原理及三种实现方式

    详细解读分布式锁原理及三种实现方式

    这篇文章从三种基于不同形式的分布式锁的实现,数据库、缓存和zookeeper,内容比较详细,具有一定参考价值,需要的朋友可以了解下。 ...

    一刀平3262020-08-17
  • MysqlMySQL5.6.31 winx64.zip 安装配置教程详解

    MySQL5.6.31 winx64.zip 安装配置教程详解

    这篇文章主要介绍了MySQL5.6.31 winx64.zip 安装配置教程详解,非常不错,具有参考借鉴价值,需要的朋友可以参考下 ...

    Jarvan2012020-07-18
  • MysqlMySQL触发器学习总结

    MySQL触发器学习总结

    创建触发器,当往order表中添加记录是,更新goods表,大家可以看下语句即可 ...

    MYSQL教程网4722019-12-07
  • Mysqlmysql 5.7.30安装配置方法图文教程

    mysql 5.7.30安装配置方法图文教程

    这篇文章主要为大家分享了mysql 5.7.30安装配置方法图文教程,感兴趣的小伙伴们可以参考一下...

    张董18412020-06-09
  • Mysql详解MySQL中的存取权限

    详解MySQL中的存取权限

    这篇文章主要介绍了详解MySQL中的存取权限,针对用户使用数据库权限分配的问题做出说明,需要的朋友可以参考下 ...

    MYSQL教程网3532020-05-13
  • Mysqlmysql性能监控工具Innotop简介及配置

    mysql性能监控工具Innotop简介及配置

    INNOTOP是一个通过文本模式显示MySQL和InnoDB的监测工具。INNOTOP是用PERL语言写成的,这使它能更加灵活的使用在各种操作平台之上,它能详细的的监控出当前...

    hebedich3612020-04-17