ITPub博客

首页 > 数据库 > Oracle > 浅析MySQL 表锁

浅析MySQL 表锁

原创 Oracle 作者:幕南风 时间:2014-07-03 14:10:07 0 删除 编辑
因为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
<!-- Baidu Button BEGIN -->

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26515977/viewspace-1208225/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 用SHELL与列表处理了件尴尬事
下一篇: Linux OOM-killer
请登录后发表评论 登录
全部评论
腾讯数据库工程师

注册时间:2012-05-10

最新文章