MySQL 原理与优化之Update 优化
前言:
谈到Update 语句大家可能不会陌生,很多情况下我们都会使用它来更新table中的记录。一般而言我们会使用innodb 的存储引擎,innodb引擎是基于行锁的,具体一点说是针对索引来加锁的(保证锁不能失效),并不是针对记录加锁,如果对于没有建立索引的字段进行过滤操作,从而执行update 的话,会导致表锁 。
今天就看看在使用innodb的时候如何使用update 语句。
已经存在course 表,其内容如下:
目前该表没有加任何的索引,默认情况下id 是表的索引。
接着让我们分别开启两个事务(两个客户端),分别执行下述指令。
开启第一个事务:
begin;update course set name = Java where id = 1;
开启另外一个事务
begin;update course set name = Spark where id = 4;
两个事务都可以执行,然后再分别执行两个事务的 commit 操作,就可以看到更新的结果。
两个事务能够并行执行的条件是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之后,释放掉表锁,第二个事务才能继续执行。
为了让两个事务能够并行执行,我们将name 加入到course 的索引中去。
create index index_name on course(name);show index from course;
接着再执行刚才的两个事务,这两个事务分别对不同的记录进行更新,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、ORACLE、SQLSERVER、MongoDB、PostgreSQL 、程序问题
服务方式:远程服务、电话支持、现场服务,沟通指定方式服务
技术标签:数据恢复、安装配置、数据迁移、集群容灾、异常处理、其它问题
本站部分文章参考或来源于网络,如有侵权请联系站长。
数据库远程运维 MySQL 原理与优化之Update 优化
相关文章
- 如何通过Mysql导出数据(mysql怎么到处数据)
- MySQL使用场景:判断字段类型(mysql判断字段类型)
- Mysql重置缓存:立即取得最新结果(mysql清空缓存)
- MySQL 索引优化实践:指定更准确的索引(mysql指定索引)
- MySQL:一种基于SQL的编程语言(mysql什么语言写的)
- 统计报表从MySQL分析季度报表(mysql按季度)
- MySQL内存配置优化:让数据库性能飞起来(mysql内存配置优化)
- MySQL 运维与分析:优化数据库性能的必要之道(mysql运维与分析)
- MySQL 死锁:解锁启动性能优化(mysql死锁解决)
- MySQL:简单修改配置文件实现优化(mysql修改配置文件)
- 提升效率:MySQL查询优化器的应用(mysql的查询优化器)
- 深入探讨MySQL设置,优化数据库性能的关键步骤(mysql设置)
- MySQL运行时间查询及优化(mysql运行时间)
- MySQL账号密码修改指南(mysql帐号密码)
- 查看MySQL数据库中所有表名(mysql数据库表名)
- MySQL分区表:建立、优化及使用(mysql建立分区)
- MySQL多表查询的高效优化技巧(mysql多表查询优化)
- MySQL插入汉字乱码解决方案(mysql插入汉字乱码)
- MySQL 主键排序优化技巧(mysql主键排序)
- 优化大法MySQL智慧百出:千万数据查询优化奥秘(mysql千万数据查询)
- 深入了解MySQL中的值算法,优化数据库查询效率(mysql中值算法)
- MySQL中NULL值的处理方法(mysql中null处理)
- 用CMD快速启动MySQL数据库(cmd启动运行mysql)
- MySQL 21 企业级数据库解决方案(21 mysql)
- MySQL分页查询优化技巧让你的数据更快速的被检索(mysql中分页显示效果)
- MySQL数据库备份使用ZIP文件压缩并设置密码(mysql zip 密码)
- MySQL数据库必要文件frm文件,详解(mysql下.frm文件)