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 COMMIT
orXA 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 ...
随机推荐
- OO第三单元作业(JML)总结
OO第三单元作业(JML)总结 目录 OO第三单元作业(JML)总结 JML语言知识梳理 使用jml的目的 jml注释结构 jml表达式 方法规格 类型规格 SMT Solver 部署JMLUnitN ...
- Serverless实践-静态网站托管
Serverless实践-静态网站托管 超多图预警!!! 本文旨在帮助不懂运维/网络/服务器知识的小白,在不租用云服务器的情况下,实现Web站点的上线部署 适合边看文章边跟着动手做 包含使用Githu ...
- [网络编程之Socket套接字介绍,套接字工作流程,基于TCP协议的套接字程序]
[网络编程之Socket套接字介绍,套接字工作流程,基于TCP协议的套接字程序] 为何学习socket套接字一定要先学习互联网协议: 1.首先:要想开发一款自己的C/S架构软件,就必须掌握socket ...
- SQLFlow的几种关系
SQLFlow的几种关系 SQLFlow可以用来分析各种数据对象之间的依赖关系,其中包含了fdd, fdr, frd, join 四种关系 fdd:表示数据从源列到目标列的关系 frd:表示结果集返回 ...
- downloader middleware的三个methods不同返回的情况
要激活一个meddleware, 要在设置里面添加.例如: DOWNLOADER_MIDDLEWARES = { 'myproject.middlewares.CustomDownloaderMidd ...
- xshell中登录服务器图形化界面
安装全套的xmanager程序 打开xshell工具程序 点击新建 输入ip等必要信息 点击隧道,英文版为tunnel 勾选红色的选项1和2 填写一些用户名和密码信息(图就略了O(∩_∩)O) 敲入指 ...
- .Net Core with 微服务 - Ocelot 网关
上一次我们通过一张架构图(.Net Core with 微服务 - 架构图)来讲述了微服务的结构,分层等内容.从现在开始我们开始慢慢搭建一个最简单的微服务架构.这次我们先用几个简单的 web api ...
- GO学习-(35) Go实现日志收集系统4
Go实现日志收集系统4 到这一步,我的收集系统就已经完成很大一部分工作,我们重新看一下我们之前画的图: 我们已经完成前面的部分,剩下是要完成后半部分,将kafka中的数据扔到ElasticSear ...
- GO学习-(3) VS Code配置Go语言开发环境
VS Code配置Go语言开发环境 VS Code配置Go语言开发环境 说在前面的话,Go语言是采用UTF8编码的,理论上使用任何文本编辑器都能做Go语言开发.大家可以根据自己的喜好自行选择.编辑器/ ...
- Docker学习(11) Dockerfile指令
Dockerfile指令 指令格式 FROM MAINTAINER RUN EXPOSE CMD ENTRYPOINT ADD COPY VOLUME WORKDIR ENV USER ONBUILD ...