大牛总结的MySQL锁优化,写得太好了( 四 )

  • 可重复读(repeatable read MySQL 默认方式):多次读取同一范围的数据会返回第一次查询的快照,即使其他事务对该数据做了更新修改 。事务在执行期间看到的数据前后必须是一致的 。
  • 串行化(serializable):是最可靠的事务隔离级别 。“写”会加“排他锁”,“读”会加“共享锁” 。
  • 当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,所以事务执行是串行的 。可避免脏读、不可重复读、幻读 。
    InnoDB 优化建议
    从锁机制的实现方面来说,InnoDB 的行级锁带来的性能损耗可能比表级锁要高一点,但在并发方面的处理能力远远优于 MyISAM 的表级锁 。这也是大多数公司的 MySQL 都是使用 InnoDB 模式的原因 。
    但是,InnoDB 也有脆弱的一面,下面提出几个优化建议供大家参考:
    • 尽可能让数据检索通过索引完成,避免 InnoDB 因为无法通过索引加行锁,而导致升级为表锁的情况 。换句话说就是,多用行锁,少用表锁 。
    • 加索引的时候尽量准确,避免造成不必要的锁定影响其他查询 。
    • 尽量减少给予范围的数据检索(间隙锁),避免因为间隙锁带来的影响,锁定了不该锁定的记录 。
    • 尽量控制事务的大小,减少锁定的资源量和锁定时间 。
    • 尽量使用较低级别的事务隔离,减少 MySQL 因为事务隔离带来的成本 。
    总结
     
    大牛总结的MySQL锁优化,写得太好了

    文章插图
     
     
    MySQL 数据库锁的思维导图
    MySQL 的锁主要分为表级锁和行级锁 。MyISAM 引擎使用的是表级锁,针对表级的共享锁和排他锁,可以通过 concurrent_insert 和 low_priority_updates 参数来优化 。
    InnoDB 支持表锁和行锁,根据索引来判断如何选择 。行锁有,行共享锁和行排他锁;表锁有,意向共享锁,意向排他锁,表锁是系统自己加上的;锁范围的是间隙锁 。遇到死锁,我们如何检测,恢复以及如何避免 。
    MySQL 有四个事务级别分别是,读未提交,读提交,可重复读,串行化 。他们的隔离级别依次升高 。
    通过隔离级别的设置,可以避免,脏读,不可重复读和幻读的情况 。最后,对于使用比较多的 InnoDB 引擎,提出了一些优化建议 。
    作者:崔皓
    简介:十六年开发和架构经验,曾担任过惠普武汉交付中心技术专家,需求分析师,项目经理,后在创业公司担任技术/产品经理 。善于学习,乐于分享 。目前专注于技术架构与研发管理 。
    【51CTO原创稿件,合作站点转载请注明原文作者和出处为51CTO.com】




    推荐阅读