Documentation Home

14.6.2.3 排序索引构建

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

索引构建分为三个阶段。第一阶段 扫描聚簇索引,生成索引条目并添加到排序缓冲区中。当排序缓冲区变满时,条目将被排序并写出到临时中间文件。此过程也称为 运行。在第二阶段,将一个或多个运行写入临时中间文件,对文件中的所有条目执行合并排序。在第三个也是最后一个阶段,排序后的条目被插入到 B 树中。

在引入排序索引构建之前,索引条目是使用插入 API 一次一条记录插入到 B 树中的。此方法涉及打开 B 树 游标以查找插入位置,然后使用 乐观插入将条目插入到 B 树页面中。如果由于页面已满而导致插入失败, 则将执行悲观插入,这涉及打开 B 树游标并根据需要拆分和合并 B 树节点以为条目找到空间。这种自上而下”的缺点建立索引的方法是寻找插入位置和B树节点不断分裂和合并的代价。

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

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

要为将来的索引增长留出空间,可以使用该 innodb_fill_factor变量来保留一定百分比的 B 树页面空间。例如,设置 innodb_fill_factor为 80 在排序索引构建期间保留 B 树页面中 20% 的空间。此设置适用于 B 树叶页和非叶页。它不适用于用于 TEXTBLOB条目的外部页面。保留的空间量可能与配置的不完全相同,因为该 innodb_fill_factor值被解释为提示而不是硬限制。

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

全文索引 支持排序索引构建 。以前,SQL 用于将条目插入全文索引。

排序索引构建和压缩表

对于压缩表,以前的索引创建方法将条目附加到压缩页和未压缩页。当修改日志(表示压缩页面上的可用空间)变满时,将重新压缩压缩页面。如果由于空间不足导致压缩失败,页面将被拆分。使用排序索引构建,条目仅附加到未压缩的页面。当未压缩的页面变满时,它会被压缩。自适应填充用于确保大多数情况下压缩成功,但如果压缩失败,则会拆分页面并再次尝试压缩。这个过程一直持续到压缩成功。有关压缩 B 树页面的更多信息,请参见 第 14.9.1.5 节,“InnoDB 表的压缩工作原理”

排序索引构建和重做日志记录

在排序索引构建期间禁用重做日志记录。相反,有一个 检查点可确保索引构建能够承受意外退出或失败。检查点强制将所有脏页写入磁盘。在排序索引构建期间,页面清理器线程会定期收到信号以刷新 脏页,以确保可以快速处理检查点操作。通常,当干净页面的数量低于设定的阈值时,页面清理器线程会刷新脏页。对于排序索引构建,脏页会被及时刷新以减少检查点开销并并行化 I/O 和 CPU 活动。

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

排序的索引构建可能会导致 优化器统计信息与以前的索引创建方法生成的统计信息不同。预计不会影响工作负载性能的统计差异是由于用于填充索引的算法不同所致。