有童鞋在后台留言:
沈老师,MyISAM只支持表锁,存储但网上文章却说,更合在并发插入量比较大的频繁插入时候,比较适合使用MyISAM,用什引擎这矛盾吗?
这个问题,存储涉及MySQL表锁的更合一些细节,借着这个问题,频繁插入系统性说下表锁的用什引擎“所以然”。
画外音:网上不少文章只说结论,存储不说为什么,容易让人蒙圈。
MySQL表锁知识系统性梳理。
MySQL,除InnoDB支持行锁外,MySQL的其他存储引擎均只使用表锁,例如:MyISAM, MEMORY, MERGE等。
(1) 表锁占用内存少很多,行锁的数量与行记录数相关,非常耗内存;
(2) 如果业务经常读写表中很大一部分数据时,表锁会更快,因为此时只涉及一个锁,而不是同时管理N多个锁;
(3) 如果业务经常使用group by,表锁会更快,原因同(2);
画外音:这样的一些场景,使用MyISAM比InnoDB更优。
和其他临界资源的读写锁类似。
写时,要加写锁:
读时,要加读锁:
表锁释放时:
如果写锁队列和读锁队列里都有锁,写有更高的优先级,即写锁队列先出列。这么做的原因是,如果有“大查询”,可能会导致写锁被批量“饿死”,而写锁往往释放很快。
画外音:潜台词是,如果有大量并发update请求,select会等所有update请求执行完才执行。
如果要分析表锁冲突情况,可查看:
这两个变量。
使用以下命令查看:
show status like 'Table%';
如果等待表锁的次数占比较大,说明表锁可能是潜在瓶颈。
说了半天,还是没有讲到点子上,为什么在并发插入量比较大的时候,比较适合使用MyISAM呢?不会因为表锁频繁冲突而导致吞吐量降低吗?
画外音:知识的系统性,比问题答案更重要。
MyISAM的索引与记录存储分离,有单独的区域存储行记录,PK是非聚集索引。
这个知识点就不展开了,以前讲过。
MyISAM表,如果数据文件(data file)紧密存储,中间没有空闲块(free blocks),数据总是插入到数据文件的尾部(end),就如同追加日志一样,性能很高,此时的并发insert与select是不加锁的(lock free)。
如上图所示:
MyISAM表,如果数据文件(data file)中间有空洞(hole),上述机制会失效,直到空洞被新数据填满,又会启用不加锁机制。
删除或者修改数据,都可能导致空洞。
如上图所示:
再如上图所示:
虽然MyISAM只支持表锁,但高并发select与insert的业务场景,上述机制使得MyISAM的表锁依然有非常强劲的性能。
画外音:本文基于MySQL5.6。
思路比结论重要,希望大家有收获。
责任编辑:赵宁宁 来源: 架构师之路 存储引擎MySQL数据库(责任编辑:时尚)
兴达国际(01899.HK)发布公告:预期2020年纯利同比减少50%
2016年全国住房公积金业务主要指标持续增长 资金使用效率不断提高
外汇局通报24起外汇违规案例 切实打好防范化解金融风险攻坚战