2011年6月1日星期三

MySql InnoDB MyISAM锁定机制优化

InnoDB:行级锁定
        间隙锁 -- 通过在指向数据库记录的第一个索引键之前和最后一个索引键之后的空域空间标记锁定实现的

间隙锁隐患:

  • 当Query无法利用索引的时候,InnoDB会放弃使用行级别锁定而改用表级别锁定,造成并发性能降低;
  • 当Query使用索引并不包含所有过滤条件时,数据检索使用到的索引键中的数据可能有部分并不属于该Query的结果行列,但是也会被锁定,因为间隙锁锁定是一个范围,而不是一个具体的索引键;
  • 当Query在使用索引定位数据的时候,如果使用的索引键一样访问的数据行不同(索引只是过了条件的一部分),它们一样会被锁定。
行锁优化建议:
  • 尽可能让所有的数据检索都通过索引来完成,从而避免InnoDB因为无法通过索引键加锁而升级为表级锁定
  • 合理设计索引,让InnoDB在索引键上面加锁的时候尽可能准确,尽可能缩小锁定范围,避免造成不必要的锁定而影响其他的Query的执行;
  • 尽可能减少基于范围的数据检索过滤条件,避免因为任何间隙锁带来的负面影响而锁定了不该锁定的记录;
  • 尽量控制事物的大小,减少锁定的资源量和锁定的时间长度;
  • 在业务环境允许的情况下,尽量使用较低级别的事物隔离,以减少MySql因为实现事物隔离级别所带来的附加成本;

  • 类似业务模块中,尽可能按照相同的访问顺序来访问,防止产生死锁;
  • 在同一个事物中,尽可能做到一次锁定需要的所有资源,减少死锁产生的概率;
  • 对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒程度,通过表锁定来减少死锁产生的概率。

MyISAM:表级锁定

锁定优化建议:
  • 缩短锁定时间
     尽量减少大的复杂的Query,将复杂的Query拆分成几个小的Query分步进行;
     尽可能建立足够高效的索引,让数据检索更迅速;
     尽量让MyIASM存储引擎的表只存放必要的信息,控制字段类型;
     利用合适的机会优化MyISAM表数据文件。
  • 分离能并行的操作 (并发插入)
     concurrent_insert=2,无论MyISAM存储引擎的表数据文件的中间部分是否存在因为删除数据而留下的空闲空间,都允许在数据尾部进行Concurrent Insert;
     concurrent_insert=1,当MyISAM存储引擎的表数据文件的中间不存在空闲空间的时候,可以从尾部进行Concurrent Insert;
     concurrent_insert=0,无论MyISAM存储引擎的表数据文件的中间部分是否存在因为删除数据而留下的空闲空间,都不允许Concurrent Insert;
  • 合理利用读写优先级
     low_priority_updates=1,将写的优先级设置比读低,优先保证写入性能的话,则不设置low_priority_updates参数了;
     如果数据被删除的可能性很小,对暂时浪费的少量空间不是特别在乎,可以将concurrent_insert=2,如果删除量不是很小的话,还是建议将concurrent_insert=1。

没有评论:

发表评论

上海松善实业有限公司

    上海松善实业有限公司是一家集多品牌销售于一体的电线电缆骨干企业,公司成立于2016年。 公司拥有国内各大品牌:起帆、远东、上上、江南、胜华等。     主要产品有:高低压电力电缆、橡套电缆、控制电缆、架空绝缘电缆、塑胶电缆、电子计算机电缆、通讯电缆、...