分区表是将一张表分成多张独立子表,每个子表是一个区,目的是提高查询效率。
从 server 层来看,只有一张表。但是从引擎层来看,是多张表,对应多个.idb文件。引擎层访问数据只访问特定分区表,也只对特定分区表加锁,可以减小锁范围。
但是 server 层加的锁,比如 MDL 锁,就会加到它认为的一张表,实际上是所有分区表上。加 MDL 锁的目的是确保所有分区表结构一致。同时会造成如下场景:对一个分区执行 truncate 语句,试图获取 MDL 写锁,与表的查询语句(获取 MDL 读锁)冲突。
分区表的典型应用场景是归档表,分区直观简洁,业务代码也更清晰。而且清理特定分区数据,不会影响其他分区。