转载请注明转载自:忆雨林枫

InnoDB索引的物理结构

除了空间索引外,InnoDB的索引都是B-tree 数据结构。空间索引使用的是 R-trees,这是专门用于检索多维数据的数据结构。索引记录被存储在B-tree或B-tree的叶子页上,索引页的默认大小是16KB。

当新记录插入到一个InnoDB 聚集索引中, InnoDB尝试将页的 1/16 空闲出来,以供后期的索引记录的插入和更新。如果插入的索引记录是以连续的顺序(升序或降序),那么结果就是索引页使用量大约15/16,如果是随机顺序插入,那么索引页的使用量为 1/2 到 15/16 。

InnoDB在创建或重新B-树索引时执行批量加载。这种创建索引的方法被称为构建排序的索引。配置选项innodb_fill_factor定义,在构建排序的索引期间每个B-树页的使用量百分比。其余的空间被保留,用于未来的索引增长。空间索引不支持构建排序的索引。 innodb_fill_factor设置为100,意思就是,保留聚集索引页1/16的空间给后期的索引增长使用。

如果InnoDB索引页的使用量低于 MERGE_THRESHOLD(如果没有指定,那么默认是50%),那么InnoDB缩小索引树来释放页, MERGE_THRESHOLD 设置适用于B-树 和 R-树索引。

您可以在初始化MySQL实例之前,通过设置配置选项innodb_page_size来为MySQL实例中的所有InnoDB表空间定义页的大小。一旦实例的页的大小被定义了,就不能在不重新初始化实例的情况下对其进行更改。支持的页的大小有 64KB、32KB、16KB(默认的), 8KB 和 4KB,对应的选项值是 64k32k、 16k8k 和 4k

提示:使用特定大小的InnoDB页的MySQL实例,不能使用其他不同大小页实例中的数据文件或日志文件。