InnoDB 排序索引构建

406 阅读4分钟

InnoDB 排序索引构建

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

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

在引入排序的索引版本之前,使用插入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树页面的更多信息,请参见 “如何压缩InnoDB表”

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

在排序索引构建期间,重做日志记录被禁用。而是有一个 检查点来确保索引构建可以承受意外的退出或失败。该检查点强制将所有脏页写入磁盘。在排序索引的构建过程中,将定期向页面清洁器线程发送信号以刷新 脏页面,以确保可以快速处理检查点操作。通常,当清除页数低于设置的阈值时,页面清除程序线程将刷新脏页。对于排序的索引生成,脏页将立即刷新,以减少检查点开销并并行化I / O和CPU活动。

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

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

qrcode_for_gh_3214f9e3470a_258.jpg