聚簇索引
聚簇索引并不是一种单独的索引类型,而是一种数据存储方式。
当表有聚簇索引时,它的数据行实际上存放在索引的叶子页(leaf page)中。术语“聚簇”表示数据行和相邻的键值紧凑地存储在一起。因为无法同时把数据行存放在两个不同的地方,所以一个表只能有一个聚簇索引。
下图展示了聚簇索引中的记录是如何存放的。注意,叶子页包含了一条记录的全部数据,但是节点页只包含了索引列。在这个案例中,索引列包含的是整数值。

InnoDB 根据主键聚簇数据,这意味着图中所示的“索引列”就是主键列。
如果没有定义主键,那么 InnoDB 会自动选择一个唯一的非空索引代替。如果没有这样的索引,InnoDB 会隐式定义一个主键来作为聚簇索引。
这样做的缺点在于,所有需要使用这种隐藏主键的表都依赖一个单点的“自增值”,这可能会导致非常高的锁竞争,从而出现性能问题。
什么时候按主键顺序插入反而会更糟?
对于高并发的工作负载,在 InnoDB 中按主键顺序插入可能会造成明显的写入竞争。
主键的上界会成为“热点”。因为所有的插入都发生在这里,所以并发插入可能导致间隙锁竞争。
另一个热点可能是 AUTO_INCREMENT 锁机制。
如果遇到这个问题,则可能需要考虑重新设计表或者应用,或者更改 innodb_autoinc_lock_mode 配置。
最后更新于