4 MySQL学习---MySQL索引( 八 )


(1)下一条流就会写入新的页中,一旦数据按照这种顺序的方式加载,主键页就会近乎于顺序的记录填满,提升了页面的最大填充率,不会有页的浪费 。
(2)新插入的行一定会在原有的最大数据行下一行,MySQL定位和寻址很快,不会为计算新行的位置而作出额外的消耗 。
(3)减少了页分裂和碎片的产生 。

  • 使用uuid的索引内部结构
因为uuid相对顺序的自增id来说时毫无规律可言的,新行的值不一定要比之前的主键的值要大,所以InnoDb无法做到总是把新行插入到索引的最后,而是需要为新寻找新的合适的位置从而来分配新的空间 。
这个过程需要做很多额外的操作,数据的毫无顺序会导致数据分布散乱,将会导致以下问题:
(1)写入的目标页很可能已经刷新到磁盘上并且从缓存中移除,或者还没有被加载到缓存中,InnoDB在插入之前不得不先找到并从磁盘读取目标页到内存中,这将导致大量的随机IO 。
(2)因为写入是乱序的,InnoDB不得不频繁地做页分裂操作,以便为新的行分配空间,页分裂导致移动大量的数据,一次插入最少需要修改三个页以上 。
(3)由于频繁的页分裂,页会变得稀疏并被不规则地填充,最终会导致数据有碎片 。
结论:使用InnoDB引擎应该尽可能地按主键的自增顺序插入,并且尽可能地使用单调的增加的聚簇键的值来插入新行 。
【4 MySQL学习---MySQL索引】

经验总结扩展阅读