开场:大家好!今天我们来探讨MySQL中的一个重要概念:表锁。我们常听说MySQL的表锁,但它到底是怎么一回事呢?别急,我们一步步来解析。

一、表锁是什么?
在MySQL中,除了InnoDB引擎支持行锁以外,其他像MyISAM、MEMORY这类存储引擎只使用表锁。
表锁的含义:就是对整张表加锁。想象一下,你在图书馆借阅书籍,如果这本书被别人预定了(加锁了),那你就得等他们用完(解锁)才轮到你。
二、表锁有什么好处呢?
内存占用少:表锁比行锁节省很多内存,因为它不用像行锁那样对每一行数据都加锁。
速度快:当你要操作表中很大一部分数据时,表锁只涉及一个锁,处理起来比行锁快。
适合大查询:像做group by这样的大查询,表锁通常会更有效率。
三、表锁的运作机制
写操作:如果要写入数据,系统会给表加上写锁。如果表已经被锁,写操作就会排队等候。
读操作:读取数据时会加读锁,但如果表有写锁,读操作也得排队。
四、表锁的管理
查看表锁:通过show status like 'Table%';命令,我们可以看到立即获得表锁和等待表锁的次数。
何时成为瓶颈:如果等待表锁的次数占比较大,说明表锁可能成为性能瓶颈。
五、为什么并发插入时MyISAM表现好?
索引和数据分离:MyISAM的索引和数据是分开存储的,主键索引非聚集。
高效插入机制:如果MyISAM表的数据文件没有空洞,新数据总是添加到文件末尾,这样的插入操作非常高效。
空洞问题:如果因为删除或修改操作产生了数据文件中的空洞,那么上述机制会暂时失效,直到空洞被填满。
现在国产数据库比如OceanBase底层用的是LSMTree结构的, 这种对插入会友好一点。如果没啥复杂需求,重insert场景下,使用基于LSM的引擎性能更好,不过相对的读场景就会弱下来
结论
虽然MyISAM只支持表锁,但在某些场景下,特别是高并发的select和insert操作时,MyISAM仍然可以提供出色的性能。




