#### 15.6.2.3 排序索引构建

[](<>)[](<>)

`InnoDB`在创建或重建索引时执行批量加载，而不是一次插入一个索引记录。这种索引创建方法也称为排序索引构建。空间索引不支持排序索引构建。

索引构建分为三个阶段。在第一阶段，[聚集索引](glossary.html#glos_clustered_index)被扫描，并生成索引条目并将其添加到排序缓冲区。当。。。的时候[排序缓冲区](glossary.html#glos_sort_buffer)变满时，条目将被排序并写入临时中间文件。此过程也称为“运行”。在第二阶段，将一个或多个运行写入临时中间文件，对文件中的所有条目执行合并排序。在第三个也是最后一个阶段，将排序后的条目插入到[B树](glossary.html#glos_b_tree).

在引入排序索引构建之前，使用插入 API 将索引条目一次插入 B 树中的一条记录。此方法涉及打开 B 树[光标](glossary.html#glos_cursor)找到插入位置，然后使用[乐观的](glossary.html#glos_optimistic)插入。如果由于页面已满而导致插入失败，则[悲观](glossary.html#glos_pessimistic)将执行插入，这涉及打开 B-tree 游标并根据需要拆分和合并 B-tree 节点以找到条目空间。这种构建索引的“自上而下”方法的缺点是搜索插入位置的成本以及 B 树节点的不断拆分和合并。

排序索引构建使用“自下而上”的方法来构建索引。使用这种方法，对最右侧叶页的引用保存在 B 树的所有级别。分配必要 B 树深度的最右侧叶页，并根据其排序顺序插入条目。一旦叶页已满，就会将一个节点指针附加到父页，并为下一次插入分配一个兄弟叶页。这个过程一直持续到所有条目都被插入，这可能导致插入到根级别。分配同级页时，释放对先前固定叶页的引用，新分配的叶页成为最右边的叶页和新的默认插入位置。

##### 为未来的索引增长保留 B-tree 页面空间

要为未来的指数增长留出空间，您可以使用[`innodb_fill_factor`](innodb-parameters.html#sysvar_innodb_fill_factor)变量以保留一定百分比的 B 树页面空间。例如，设置[`innodb_fill_factor`](innodb-parameters.html#sysvar_innodb_fill_factor)to 80 在排序索引构建期间保留 B 树页面中 20% 的空间。此设置适用于 B 树的叶子页面和非叶子页面。它不适用于用于[`文本`](blob.html)要么[`斑点`](blob.html)条目。保留的空间量可能与配置不完全相同，因为[`innodb_fill_factor`](innodb-parameters.html#sysvar_innodb_fill_factor)value 被解释为提示而不是硬限制。

##### 排序索引构建和全文索引支持

支持排序索引构建[全文索引](glossary.html#glos_fulltext_index).以前，SQL 用于将条目插入全文索引。

##### 排序索引构建和压缩表

为了[压缩表](glossary.html#glos_compression)，以前的索引创建方法将条目附加到压缩和未压缩的页面。当修改日志（表示压缩页面上的可用空间）变满时，将重新压缩压缩页面。如果由于空间不足而导致压缩失败，则页面将被拆分。使用排序索引构建，条目仅附加到未压缩的页面。当一个未压缩的页面变满时，它就会被压缩。自适应填充用于确保在大多数情况下压缩成功，但如果压缩失败，则会拆分页面并再次尝试压缩。这个过程一直持续到压缩成功。有关 B-Tree 页面压缩的更多信息，请参阅[第 15.9.1.5 节，“InnoDB 表的压缩如何工作”](innodb-compression-internals.html).

##### 排序索引构建和重做日志

[重做日志记录](glossary.html#glos_redo_log)在排序索引构建期间被禁用。相反，有一个[检查点](glossary.html#glos_checkpoint)确保索引构建可以承受意外退出或失败。检查点强制将所有脏页写入磁盘。在排序索引构建期间，[页面清洁器](glossary.html#glos_page_cleaner)定期向线程发出信号以刷新[脏页](glossary.html#glos_dirty_page)确保检查点操作可以快速处理。通常，当干净页面的数量低于设置的阈值时，页面清理线程会刷新脏页面。对于排序索引构建，脏页被迅速刷新以​​减少检查点开销并并行化 I/O 和 CPU 活动。

##### 排序索引构建和优化器统计

排序索引构建可能会导致[优化器](glossary.html#glos_optimizer)与以前的索引创建方法生成的统计信息不同。预计不会影响工作负载性能的统计数据差异是由于用于填充索引的算法不同造成的。
