首页 > Linux性能优化测试 > 浅析MySQL 表锁

浅析MySQL 表锁

2015年5月7日

浅析MySQL 表锁
http://www.tuicool.com/articles/MZ36vm
原文 http://blog.csdn.net/dba_waterbin/article/details/12125703
因为MySQL独树一帜的存储引擎架构,导致MySQL可在2个地方实现锁机制:Server层和存储引擎层
存储引擎层可通过接受Server层传递来的锁类型而自行决定该如何给数据上锁
表锁是在Server层实现的锁定机制,MyISAM并没有自己实现,则是完全使用Server层传递来的表锁

表锁优点是附加成本低,缺点是可支持的并发度非常之小
现阶段MySQL公认的2个经典版本是5.1和5.5,然而5.5引入元数据锁,使得表锁的信息更为复杂
在5.1,我们通过show full processlist;输出结果中State为Locked的便为表锁
而5.5.3 Locked被Table lock取代,在5.5.6 Table lock又被waiting for table level lock取代
并且,有些在5.1是属表锁,却在5.5已经不再是了,取而代之的是”waiting for table metadata lock”
虽然也是表锁,但是比较另类,属于新引入的表元数据锁,这些锁在表锁监控当中是不被统计的
比如,用lock tables显示加上的锁,还有,服务器在重命名或删除一个表时创建的锁

㈠ 找出谁持有表锁
mysqladmin debug
或者,我们也可以粗糙的用show processlist,但这信息比较不全

㈡ 监控表锁
show status like ‘table_locks%’
有2个输出值
Table_locks_immediate:自上次启动以来申请的表锁数,可累计,重启后则被初始化
Table_locks_waited:被阻塞的表锁数,可累计
这2个变量要合起来看:每申请多少个表锁,有几个被锁住

㈢ 表锁优化

可从2个方面优化表锁
1)缩短锁定时间

① 执行query最快的就是不去执行,缓存为王
② 创建高效的MyISAM索引
③ 合理设计MyISAM Schema设计

2)让能并行的尽量并行

开启MyISAM 并发插入的特性(concurrent insert)
当concurrent_insert=0,无论数据文件中间是否存在空块,都不允许concurrent insert
当concurrent_insert=1, 仅在数据文件中间不存在空块时,才允许从数据文件尾部进行 concurrent insert
当concurrent_insert=2,无论数据文件中间是否存在空块,都允许从数据文件尾部进行concurrent insert
建议是将concurrent_insert=1

3)利用读写优先级

缺省情况下MySQL是写优先级高于读,但如果我们的业务是于读为主,比如www,blog,等
此时我们可设置low_priority_updates=1,告诉MySQL先处理读请求

By DBA_WaterBin
2013-09-28
Good Luck

分类: Linux性能优化测试 标签:
本文的评论功能被关闭了.