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 ...
随机推荐
- ThreadLocal引起的一次线上事故
> 线上用户存储数据后查看提示无权限 前言 不知道什么时候年轻的我曾一度认为Java没啥难度,没有我实现不了的需求,没有我解不了的bug 直到我遇到至今难忘的一个bug . 线上用户存储数据后查 ...
- 图扑软件正式加入腾讯智维生态发展计划,智能 IDC 开启数字经济新征程
4 月 23 日,主题为<智汇科技,维新至善>的腾讯数据中心智维技术研讨会在深圳胜利召开,发布了腾讯智维 2.0 技术体系,深度揭秘了智维 2.0 新产品战略和技术规划.图扑软件(High ...
- IIS部署.Net5全流程
介绍 Internet Information Services (IIS) 是一种灵活.安全且可管理的 Web 服务器,用于托管 Web 应用(包括 ASP.NET Core).虽然我们的程序可以跨 ...
- C++ primer plus读书笔记——第3章 处理数据
第3章 处理数据 1. C++对于变量名称的长度没有限制,ANSI C只保证名称中的前63个字符有意义(前63个字符相同的名称被认为是相同的,即使第64个字符不同). 2. 对类型名(int)使用si ...
- 【BUAA软工】Beta阶段事后分析
设想与目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 解决的问题 总体解决的问题:新手编程者配置编程环境难.本地编写的代码跨设备同步难.本地ide安装使用过程 ...
- OO_Unit2_多线程电梯
CSDN博客链接 一.第一次作业 1.需求分析 单部多线程傻瓜调度(FAFS)电梯 2.实现方案 输入接口解析 类似于Scanner,我们使用ElevatorInput进行阻塞式读取(第一次作业较简单 ...
- Iterable 和 Iterator
可以被for循环输出的为iterable (可迭代对象) 可以被next()调用并不断返回下一个数据的对象为iterator迭代器(python一切皆对象) 数据流,无法知晓其终点,只能推过next不 ...
- Linux USB ECM Gadget 驱动介绍
1 USB ECM介绍 USB ECM,属于USB-IF定义的CDC(Communication Device Class)下的一个子类:Ethernet Networking Control Mo ...
- [bug] Python Virtualenv 安装失败:ERROR: Cannot uninstall 'filelock'.
参考 https://my.oschina.net/gain/blog/4333100
- 有关fgets和fcntl的讨论-待整理更新
问题引出 一个client程序:select 超时监听 sockfd套接字 和 STDIN_FILENO标准输入:若sockfd可读则接收server报文:若标准输入可读(按下回车),则开始用fget ...