当前位置: 首页 > MySQL > 针对MySQL/MariaDB锁机制总结的一些知识点

针对MySQL/MariaDB锁机制总结的一些知识点

        在几年前用Mysql的MyISAM的引擎多,但是近几年可能用InnoDB的更多些。这两个引擎各自有各自的优点,有查询速度上的不同,也有事务支持上的不同等等。在锁机制上也有很大的不同,我这篇文章既然写锁,自然这两个引擎都会涉及一下。

首先说一下锁的分类

        1.表级锁

        该锁是MyISAM引擎采用的锁,这也是最大粒度的锁,直接锁定整张表,在锁定期间,如果是排他锁,无法对该表进行其他操作。锁速度快,比较简单,但是并发性不够好。(注意速度跟并发性不是一个概念)

表级锁除了读锁和读锁(S锁)之间是可以并存的,其他的锁都是排他的(X锁)。

        2.行级锁

        这种锁机制是InnoDB采用的,这是最小粒度的锁,这种锁的行级冲突少,并发性高,但是速度也稍慢。在高并发时,在锁定资源的争夺上消耗大,最容易出现死锁,学习锁原理最重要的就是避免死锁,比如说下图这两种死锁的情况:

(图片来源:http://hedengcheng.com/?p=771)

       关于 InnoDB锁 推荐一篇文章http://hedengcheng.com/?p=771  ,写的深入详细。耐心看完你就会明白什么情况下会出现死锁,为什么出现死锁,如何避免死锁。

        3.页级锁

       BDB引擎采用这种锁,看完表级锁与行级锁的优缺点后,那么页级锁就是介于这两者之间的一种锁。

如何避免锁?

        一个实际的例子是,网站数据存储采用MySQL的主从来进行读写分离,如果读库在进行一个大的select操作,而写库又在进行update/insert操作,这样造成的结果就是写同步等锁,也就是数据延迟。

相同的道理,如果读库正在同步一个耗时的update语句,那么读库的读取数据就会慢,影响页面的打开速度。

        那如何避免和减少这些锁,就是开发中所要考虑的问题:

对于MyISAM因为是整表锁,所以要减少大SQL,拆分成几个小的;要有足够的高效的索引,以减小查询时间;利用optimize table定期进行优化表数据文件;根据实际业务合理配置读写优先级,例如配置文件中low_priority_updates的设置。

对于InnoDB来说,所有的查询都要通过索引,如果没有索引,那行级锁将失效,查询因没有索引而变成表级锁;尽量减少范围查询;合理的设计索引,来缩小行级锁定的范围,具体就是参考我上面推荐的文章;如果用事务,则要控制事务的大小,保证事务内SQL的顺序,避免死锁(参考上面推荐的文章)。


        关于锁总结就这些,有些锁是可以靠实战经验来避免,根据我上面介绍的理论也能大概的了解。但是要深入全面的掌握锁机制还需要大量的理论与实践,而我上面推荐的那篇文件就是一篇不错的可以带你入门的文章。

    

转载时请以 超链接的形式 注明:转自Ferman

                  

About me