面试必备——InnoDB索引的物理结构


基于MySQL8.0

1.简介

索引都用B树(其实是B+树,B+Tree也是B-Tree的一种,B-Tree=B Tree)结构,除了空间索引。空间索引用R树(R 树是用于为多维数据编制索引的专用数据结构)。

索引记录存储在树的叶子页中。

1.1.页

页,page。一个表示,任何时候在磁盘(数据文件)和内存(缓冲池)之间传输数据量的单位。

一页包含一行或多行,取决于每行的数据量。若某行不能完全适合单个页面,需要设置其他指针式数据结构,以便改行可以放到一个页中。

为了容纳更多数据,使用压缩行格式。使用BLOB或large text格式的表,使用紧凑行格式运行这些列和其余部分分开存储(外部页),以减少不引用这些列的查询的I/O开销和内存使用量。

1.2.页设置

索引页的默认大小是16KB、16K、16384三种形式都可以。

查看索引页的默认大小,单位为B。(1KB=1024B)

mysql> SHOW GLOBAL STATUS LIKE 'innodb_page_size';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| Innodb_page_size | 16384 |
+------------------+-------+

启动MySQL实例时,通过innodb_page_size设置,一旦设置不可以动态修改,只能修改之后重启。

设置命令行格式如下,可选的有效值为64K、32K、16K、8K、4K。MySQL实例中所有磁盘数据结构共享相同的页设置。

	--innodb-page-size=#

1.3.页使用

新数据插入到聚集索引(主键索引)时,页会保留1/16的空间,以便将来插入和更新索引记录。如果按顺序(升序或降序)插入,生成的页最大为15/16;如果随机顺序插入,页最大1/2~15/16就满了。每个B树页的空间占比,可以通过innodb_fill_factor设置,默认值100,范围10-100的整数。

命令如下,可以动态设置。

	--innodb-fill-factor=#

举个例子:设置80,则留20%。100,会留1/16。

2.索引生成

InnoDB创建或重建B树索引的时候,会执行大容量加载,即排序索引生成。而不是在创建或重新生成索引时一次插入一个索引记录。

上文innodb_fill_factor变量,定义在排序索引构建期间填充的每个B树页上的空间百分比,剩余空间保留用于将来的索引增长。

空间索引不支持排序索引生成。

全文索引支持排序索引生成。

innodb_fill_factor,适用B树叶子页和非叶子页,不适用TEXT和BLOB等外部页。

2.1.三阶段

索引生成有三个阶段。

  1. 扫描聚集索引(主键索引),并生成索引条目并将其添加到排序缓冲区中。当排序缓冲区变满时,将对条目进行排序并写到临时中间文件中。此过程也称为“运行”。
  2. 如果将一个或多个“运行”写入临时中间文件,则会对文件中的所有条目执行合并排序。
  3. 排序后的条目将插入到B树中。

2.2.自下而上

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

关注公众号- 编程highway - 获取更多好文和学习资料

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程还未

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值