文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  排序索引构建

17.6.2.3 排序索引构建

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

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

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

排序索引构建使用 自底向上 方法来构建索引。使用这种方法,在 B 树的所有级别上都持有对最右侧叶节点的引用。为必要的 B 树深度分配最右侧叶节点,并根据其排序顺序插入条目。一旦叶节点填满,节点指针就会附加到父节点,并且为下一个插入分配一个兄弟叶节点。此过程持续进行,直到所有条目都被插入,这可能会导致插入到根级别。当分配一个兄弟节点时,对先前固定叶节点的引用被释放,并且新分配的叶节点成为最右侧叶节点,并且新的默认插入位置。

为将来的索引增长保留 B 树页空间

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

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

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

排序索引构建和压缩表

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

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

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

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

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