Mysql优化(出自官方文档) - 第十二篇(优化锁操作篇)
Mysql优化(出自官方文档) - 第十二篇(优化锁操作篇)
1 Internal Locking Methods
这里介绍Mysql的几种锁,该锁由Mysql自行进行管理,用户不需要处理该锁。
Row-Level Locking
对于InnoDB,行锁可以通过
SELECT ... FOR UPDATE语句进行获取,如果行锁中出现了死锁,Mysql会自行检测死锁,并对相关的事务进行一定的回滚,这会极大的影响性能。行锁的优点如下:- 当不同session访问不同的行时,可以产生更少的冲突。
- 当出现rollback的时候,需要rollback的内容也更少。
- 可以长时间的锁定某一行。
Table-Level Locking
对于
MyISAM, MEMORY或者MERGE表,使用的是表锁,这种类型的表使用场景多为read-only, read-mostly或者single-user应用中。在获取表锁的时候,如果多个请求需要获取同一张表的锁,那么通常就需要进行排序,当前请求必须等到前一个请求处理完成后才能获取到表锁进行后续的处理。表锁的优点为:
- 更少的锁内存占用(行锁往往需要较多的内存)
- 当需要处理一个表中大部分行的时候速度很快,因为只需要处理一个锁就可以了。
- 进行
GROUP BY的时候,效率更高,因为这种操作需要扫描整张表。
Choosing the Type of Locking
通常来讲,对于下面的场景,表锁优于行锁:
大多数都是读的场景
混合读写,但是写只包含更新和删除(没有插入),且都是更新和删除具体的一行(即通过
unique_key获取的行),比如下面的语句:UPDATE tbl_name SET column=value WHERE unique_key_col=key_value;
DELETE FROM tbl_name WHERE unique_key_col=key_value;
带有多个并发
INSERT的SELECT语句,也可以有极少数的UPDATE和DELETE语句多个scan或者
GROUP BY操作,但是需要保证没有写入语句。
通过使用更高级的锁,你可以更加轻松的调试并加快应用程序的效率,这些高级别的锁开销要比行级锁小很多,这些锁包括:
- 版本控制(
Versioning)可以允许同时存在多个写和读,这意味这数据库或者表对于不同的请求支持多个不同的views,实现这种功能的手段经常有:"time travel", "copy on write", "copy on demand"等。 Copy on demand在大多数情况下是比行锁要好的,但是在极端情况下,要比普通的锁占用更多的内存。- 也可以使用应用级别的锁,使用
GET_LOCK()andRELEASE_LOCK()
2 Metadata Locking
Mysql使用metadata Locking来管理对数据库对象的并发访问和保证数据的一致性,该锁不仅适用于表,也适用于schemas,stored programs(包括存储过程,函数,触发器,scheduled events), tablespaces, 使用主动使用GET_LOCK()获取到的锁。可以通过 metadata_locks 表查看当前metadata Locking的详情。
Metadata Lock Acquisition
对于
DML来讲,锁的获取按照statement里面涉及到的顺序进行;对于DDL,为了减小可能存在的死锁问题,锁的获取按照表名顺序进行,当然,也有特例,对于那些带有外键的表,其子表的锁也同时会被隐性的获取。Metadata Lock Release
Mysql在事务开始,会获取
metadata locking,在事务结束,会自动释放lock,如果当前事务对某表进行操作,其他事务尝试对该表进行DDL操作,那么其他事务会阻塞。除了
DDL语句,LOCK TABLES ... READ语句也会有获取metadata Locking的效果。如果一个事务中,某条语句获取了
metadata Locking,但是后续语句执行失败了,对于该事务,Mysql不会提前释放metadata Locking,因为这些失败的语句会写入到binlog中,锁可以保证log的一致性。在
autocommit模式下,每一条语句都是一个完整的事务,所以metadata locking的获取和释放只发生在语句的开始和结束。对于prepare语句,锁的获取开始于prepare语句,结束于prepare语句完成后。
对于Mysql8.0.13,一个处于PREPARED状态的
XA事务,即使客户端失去了链接或者服务器重启了,metadata lock也会一直被保存着(持久化),除非XA COMMITorXA ROLLBACK被执行。
3 External Locking
外部锁通常指多个Mysql进程共享一个数据文件夹,导致该文件夹被其他进程锁住的时候,当前进程就不能继续进行操作了,一般不要这么做。同时,对于MyISAM,myisamchk命令也可能会导致这种情况,需要特别注意下。
Mysql优化(出自官方文档) - 第十二篇(优化锁操作篇)的更多相关文章
- 【cocos2d-js官方文档】十二、对象缓冲池
cc.pool的使用场景 经常创建和销毁的元素,例如打飞机游戏里面的子弹等. 不适用的场景:不是很经常创建的物体,比如背景,建筑等. 如何使用cc.pool 让你的类支持cc.pool 首先,你需在需 ...
- Mysql优化(出自官方文档) - 第十篇(优化InnoDB表篇)
Mysql优化(出自官方文档) - 第十篇(优化InnoDB表篇) 目录 Mysql优化(出自官方文档) - 第十篇(优化InnoDB表篇) 1 Optimizing Storage Layout f ...
- Mysql优化(出自官方文档) - 第三篇
目录 Mysql优化(出自官方文档) - 第三篇 1 Multi-Range Read Optimization(MRR) 2 Block Nested-Loop(BNL) and Batched K ...
- Mysql优化(出自官方文档) - 第五篇
目录 Mysql优化(出自官方文档) - 第五篇 1 GROUP BY Optimization 2 DISTINCT Optimization 3 LIMIT Query Optimization ...
- Mysql优化(出自官方文档) - 第八篇(索引优化系列)
目录 Mysql优化(出自官方文档) - 第八篇(索引优化系列) Optimization and Indexes 1 Foreign Key Optimization 2 Column Indexe ...
- Mysql优化(出自官方文档) - 第九篇(优化数据库结构篇)
目录 Mysql优化(出自官方文档) - 第九篇(优化数据库结构篇) 1 Optimizing Data Size 2 Optimizing MySQL Data Types 3 Optimizing ...
- Mysql优化(出自官方文档) - 第七篇
Mysql优化(出自官方文档) - 第七篇 目录 Mysql优化(出自官方文档) - 第七篇 Optimizing Data Change Statements 1 Optimizing INSERT ...
- Mysql优化(出自官方文档) - 第六篇
Mysql优化(出自官方文档) - 第六篇 目录 Mysql优化(出自官方文档) - 第六篇 Optimizing Subqueries, Derived Tables, View Reference ...
- Mysql优化(出自官方文档) - 第四篇
Mysql优化(出自官方文档) - 第四篇 目录 Mysql优化(出自官方文档) - 第四篇 1 Condition Filtering 2 Constant-Folding Optimization ...
随机推荐
- VS2017报错 由#define后的分号引发的【“ 应输入“)】
其实并不是第十行分号出现了问题,而是由于在宏定义后面加了分号,修改成这样即可 一开始竟然没看出来--甚至以为是VS中出现"宏可以转换为constexpr"问题--下次要仔细--
- 从执行上下文(ES3,ES5)的角度来理解"闭包"
目录 介绍执行上下文和执行上下文栈概念 执行上下文 执行上下文栈 伪代码模拟分析以下代码中执行上下文栈的行为 代码模拟实现栈的执行过程 通过ES3提出的老概念-理解执行上下文 1.变量对象和活动对象 ...
- 教你用SQL实现统计排名
前言: 在某些应用场景中,我们经常会遇到一些排名的问题,比如按成绩或年龄排名.排名也有多种排名方式,如直接排名.分组排名,排名有间隔或排名无间隔等等,这篇文章将总结几种MySQL中常见的排名问题. 创 ...
- 微服务·API网关
阅文时长 | 3.52分钟 字数统计 | 1232字符 主要内容 | 1.什么是API网关 2.微服务中的API网关 3.几种部署策略 『微服务·API网关』 编写人 | SCscHero 编写时间 ...
- [bug] conda:Segmentation fault (core dumped)
参考 https://www.jianshu.com/p/5e230ef8a14d
- 【转载】Linux字符集和系统语言设置-LANG,locale,LC_ALL,POSIX等命令及参数详解
Linux字符集和系统语言设置-LANG,locale,LC_ALL,POSIX等命令及参数详解 1清风揽月10人评论5006人阅读2017-06-21 15:48:43 博文说明[前言]: 本文 ...
- Win10 禁用摄像头的方法及注意事项
Win10 禁用摄像头的方法及注意事项 windows教程 2020-03-04 223 最新的Windows10系统中应该如何禁用摄像头呢?下面MS酋长与大家分享一下.当然,如果你说用个便利贴把摄 ...
- Linux_配置匿名访问FTP服务
[RHEL8]-FTPserver:[Centos7]-FTPclient !!!测试环境我们首关闭防火墙和selinux(FTPserver和FTPclient都需要) [root@localhos ...
- 010.Python字符串的格式化
字符串的格式化 顺序传参 索引传参 关键字传参 容器类型传参(列表和元组) {}相当于占位符 1 顺序传参 strvar = "他{}牺牲自己,{}出卖组织" res = strv ...
- Java 中布尔(boolean)类型占用多少个字节
为什么要问这个问题,首先在Java中定义的八种基本数据类型中,除了其它七种类型都有明确的内存占用字节数外,就 boolean 类型没有给出具体的占用字节数,因为对虚拟机来说根本就不存在 boolean ...