根据《高性能MySQL》中所述,
InnoDB的二级索引的叶子节点中存储的是主键值,并以此作为指向行的
“
指针
”
。这样的 策略减少了当出现行移动或者数据页分裂时二级索引的维护工作。使用主键值作为指针会 让二级索引占用更多的空间,换来的好处是,InnoDB
在移动行时无须更新二级索引中的 这个“
指针
”
。
也就是说,非聚簇索引的叶子结点中存储的是主键值,这个主键值起到一个指向数据的“指针”的作用。在插入新的数据时,只需要调整非聚簇索引的树结构,更新一下索引就好了。但是对于聚簇索引来说,由于叶子结点储存了数据行,如果插入的数据是按照主键顺序尚且还好,如果不是,那么InnoDB需要为这条新纪录寻找一个合适的位置,然后做页分裂操作,为新记录分配空间。页分裂会导致移动大量数据,从磁盘将目标页的数据读取到内存中,然后写到新的页,这将导致大量的随机I/O,因此降低效率。