除了空间索引,InnoDB的索引都是B-tree数据结构。空间索引使用功能R-trees,这是一种用于多维数据的特殊数据结构。在B-tree和R-tree数据结构中,索引记录被存储在叶子节点中。每个索引页面 的默认大小是i6KB。这个页面大小是由innodb_page_size配置决定的,在MySQL实例启动时初始化。见章节15.8.1,“InnoDB启动配置”。
当新记录被插入到聚簇索引时,InnoDB会尝试留下1/16的页空间为将来的插入和更新操作准备。索引记录时被顺序插入的,最终的索引页面中,越有15/16的空间被占用。如果记录时随机插入的,页面大约只有1/2到15/16的空间被占用。
当创建或重构B-tree索引时,InnoDB使用批量加载的方式。创建索引的方法被称为排序索引构建。innodb_fill_factor变量定义每个表上每个页,空间使用上限,剩余的空间位将来的索引数据增长做准备。排序索引重构不适用于空间索引。想了解更多,请查阅章节 15.6.2.3 “Sorted Index Builds”.innodb_fill_factor为100时,聚簇索引页中,会留下1/16来应对未来的数据增长。
如果一个InnoDB索引的填充因子下降到Merge_threshold,它们的默认值会是50%,InnoDB尝试通知索引树去释放页面。MERGE_THRESHOLD适用于B-tree和R-tree索引。