为什么MySQL中推荐使用一个跟业务无关的自增键作为主键?

1.减小磁盘碎片,从而节省磁盘空间。
2.减少插入时的磁盘IO。

对于InnoDB引擎来说,mysql会优先选择主键作为聚簇索引。聚簇索引的特点是,所有的表都是根据索引值在磁盘中有序存放,而底层数据结构是b+树。为了达到这个特点,在每次添加新数据时,mysql会进行以下操作:

  • 根据索引查找到对应记录表。
  • 添加新纪录,更新索引表。

在这其中重点就是添加新纪录,因为底层的数据结构为b+树,如果在添加新的记录时,当前节点(一页大小)容纳不下这个节点,那么根据不同情况有不同操作。如果当前节点是最后一个节点,mysql有进行特殊优化,会直接添加新的页,然后将当前记录放置到新家页的首部。而如果不是最后一个节点,那么则退化到普通的b+树索引,将会将当前页表与与其右侧相邻的表进行操作,(如空间不足,还需添加新页)尽可能使几个页记录数量均等,为以后的插入留剩余空间。还有个问题就是,对于大量数据来说,乱序插入相比尾部插入还有可能造成磁盘IO较大的原因是,尾部插入时,要查找的节点极大可能是已缓存在内存中,为热数据(因为key相邻,是可大可能在同一页)。而乱序插入时,如果内存不足,可能频繁的需要从磁盘中去查找需要插入的位置。

从以上描述以及黑体字中描述可以发现,如果采用乱序插入,那么大量的表分裂会造成许多磁盘碎片,加大磁盘开销。而表分裂同时也会多次查询相邻页,从而造成磁盘io。而如果采用自增主键,那么每次插入都是尾部追加,则会使记录尽可能紧密排列,且减少磁盘IO。

你可能感兴趣的:(为什么MySQL中推荐使用一个跟业务无关的自增键作为主键?)