继续回答星球水友提问:
沈老师,MyISAM只支持表锁,但网上文章却说,在并发插入量比较大的时候,比较适合使用MyISAM,这矛盾吗? 这个问题,涉及MySQL表锁的一些细节,借着这个问题,系统性说下表锁的“所以然”。 画外音:网上不少文章只说结论,不说为什么,容易让人蒙圈。 MySQL表锁知识系统性梳理。 哪些存储引擎使用表锁? MySQL,除InnoDB支持行锁外,MySQL的其他存储引擎均只使用表锁,例如:MyISAM, MEMORY, MERGE等。 表锁有什么好处? (1)表锁 占用内存少 很多,行锁的数量与行记录数相关,非常耗内存; (2)如果业务 经常读写表中很大一部分数据时,表锁会更快 ,因为此时只涉及一个锁,而不是同时管理N多个锁; (3)如果业务 经常使用group by,表锁会更快 ,原因同(2); 画外音:这样的一些场景,使用MyISAM比InnoDB更优。 表锁是怎么运作的? 和其他临界资源的读写锁类似。 写时 ,要加写锁: (1)如果表 没有锁 ,对表加写锁; (2)否则,入写锁队列; 读时 ,要加读锁: (1)如果表 没有写锁 ,对表加读锁; (2)否则,入读锁队列; 表锁释放时 : 如果写锁队列和读锁队列里都有锁,写有更高的优先级,即 写锁队列先出列 。这么做的原因是,如果有“大查询”,可能会导致写锁被批量“饿死”,而写锁往往释放很快。 画外音:潜台词是,如果有大量并发update请求,select会等所有update请求执行完才执行。 如何查看表锁情况? 如果要分析 表锁冲突情况 ,可查看: Table_locks_immediate : 立刻获得表锁 的次数; Table_locks_waited :需要 等待表锁 的次数; 这两个变量。 使用以下命令查看:![image.png image.png](https://ucc.alicdn.com/pic/developer-ecology/88a33dbceb1e4e488c859a91e11a35d1.png)
![image.png image.png](https://ucc.alicdn.com/pic/developer-ecology/ec62c9e4c5f54f6cb08d8819cb3259d3.png)
知识点二:
MyISAM表, 如果数据文件(data file)紧密存储 ,中间没有空闲块 (free blocks) ,数据总是插入到数据文件的尾部 (end) ,就如同追加日志一样,性能很高, 此时的并发insert与select是不加锁的(lock free) 。![image.png image.png](https://ucc.alicdn.com/pic/developer-ecology/64ab6baff49b405d9b36b983a33d7986.png)
![image.png image.png](https://ucc.alicdn.com/pic/developer-ecology/0f11df24073040c0a346f1b9d9cf31a8.png)
作业
下面哪些场景,用表锁比行锁性能更高。 A :大部分SQL都是读请求。 B :SQL是读写混合,写请求是 单行的 delete或update。update t set c=xxx where unique_key=yyy;
delete from t where unique_key=zzz;
C :SQL是读写混合,写请求是高并发的insert,很少有delete或update。 D :SQL会扫描大量行记录,且有很多group by。本文转自“架构师之路”公众号,58沈剑提供。