Mysql优化(出自官方文档) - 第十二篇(优化锁操作篇)
目录
- Mysql优化(出自官方文档) - 第十二篇(优化锁操作篇)
- 1 Internal Locking Methods
- 2 Metadata Locking
- 3 External Locking
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命令也可能会导致这种情况,需要特别注意下。
转载于:https://www.cnblogs.com/seancheer/p/11505094.html
Mysql优化(出自官方文档) - 第十二篇(优化锁操作篇)相关推荐
- Nginx官方文档(三十二)【ngx_http_slice_module|ngx_http_spdy_module】
ngx_http_slice_module 示例配置 指令 slice 内嵌变量 ngx_http_slice_module 模块(1.9.8)是一个过滤器,它将请求拆分为子请求,每个子请求都返回一定 ...
- 《Redis官方文档》用Redis构建分布式锁
<Redis官方文档>用Redis构建分布式锁 用Redis构建分布式锁 在不同进程需要互斥地访问共享资源时,分布式锁是一种非常有用的技术手段. 有很多三方库和文章描述如何用Redis实现 ...
- Android官方文档training中英文翻译目录大全:29篇已翻译,45篇未翻译
Android官方文档training中英文翻译目录大全:29篇已翻译,45篇未翻译 1. Getting Started Building Your First App: 原文: https://d ...
- Unity 优化翻译官方文档(二) ------ 平台特定覆盖的纹理压缩格式
官方文档 : https://docs.unity3d.com/Manual/class-TextureImporterOverride.html 虽然Unity支持许多常见的图像格式作为导入纹理的源 ...
- cdh官方文档看后小结(含优化项)001
2019/3/22 星期五 1.安装后,能装getway的都要装getway 2.静态资源分配默认不打开 3.Cloudera使用以下版本控制约定:major.minor.maintenance. 如 ...
- ABP官方文档(四十九)【集成EntityFramework】
9.1 ABP基础设施层 - 集成Entity Framework ABP可以与任何ORM框架协同工作,它内置了对EntityFramework的集成支持.本文将介绍如何在ABP中使用EntityFr ...
- 看懂mysql执行计划--官方文档
原文地址:https://dev.mysql.com/doc/refman/5.7/en/explain-output.html 9.8.2 EXPLAIN Output Format The EXP ...
- ABP官方文档(四十四)【后台作业和后台工人】
7.1 ABP后台服务 - 后台作业和后台工人 7.1.1 简介 ABP提供了后台作业和后台工人,来执行应用程序中的后台线程的某些任务. 7.1.2 后台作业 由于各种各样的原因,你需要后台作业以队列 ...
- Unity优化翻译官方文档(六) ------ CPU Usage Profiler
官网地址 : https://docs.unity3d.com/Manual/ProfilerCPU.html CPU使用分析器显示在您的游戏中花费的时间.当它被选中时,下窗格将显示所选帧的分层时间数 ...
- storm mysql trident_Apache Storm 官方文档 —— Trident 教程
Trident 是 Storm 的一种高度抽象的实时计算模型,它可以将高吞吐量(每秒百万级)数据输入.有状态的流式处理与低延时的分布式查询无缝结合起来.如果你了解 Pig 或者 Cascading 这 ...
最新文章
- node aws 内存溢出_如何使用Node.js和AWS快速创建无服务器RESTful API
- 用Gvim建立IDE编程环境 (Windows篇)
- s3c6410 uboot代码分析《一》
- php 常用的日期函数,常用php日期函数总结
- java .item,javabb-javaitem-cloud
- 30销售是让用户开心的购买和消费
- 【指数机制代码实现】差分隐私代码实现系列(十)
- stm32f407网页服务器,STM32F407单片机通过USR-LTE-7S4模块和服务器进行4G通信
- 2016年3月8日----Javascript的函数
- 迭代器适配器{(插入迭代器back_insert_iterator)、IO流迭代器(istream_iterator、ostream_iterator)}...
- JS(JavaScript)的初了解8(更新中···)
- 立创3D文件转成stp文件应用到AD中
- win10重置网络命令_重置网络:Win10重置网络的技巧
- jQuery常用功能大全
- 积木报表-报表常用操作
- 少年,我看你骨骼精奇,见与你有缘,这套算法赠你
- 居然可以用jQuery实现360度汽车产品3D旋转展示酷炫特效 使用你的小鼠标来试试吧
- 机器学习实战之朴素贝叶斯与垃圾邮件分类
- Duilib异形窗口
- 微信高级群发之预览接口
热门文章
- bat 指定hid驱动加载_Linux驱动程序学习一 (续)
- 2d游戏动作软件支持c语言,C语言编写简单2D游戏
- JavaSE基础-02-接口
- ImageLoader的简单分析(四)
- 《Android音视频开发》封面由你来投票
- 两步集成TV移动框架,从未如此简单
- mysql 文本处理函数,MySQL常用的文本处理函数
- iPhone清理喇叭灰尘_手机喇叭用久了灰尘多,与其经常换手机,不如自己动手清理...
- 高速计算机的应用领域是什么,计算机的应用领域
- mysql时间设计模式_java 23种设计模式及具体例子 收藏有时间慢慢看