基于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.三阶段
索引生成有三个阶段。
- 扫描聚集索引(主键索引),并生成索引条目并将其添加到排序缓冲区中。当排序缓冲区变满时,将对条目进行排序并写到临时中间文件中。此过程也称为“运行”。
- 如果将一个或多个“运行”写入临时中间文件,则会对文件中的所有条目执行合并排序。
- 排序后的条目将插入到B树中。
2.2.自下而上
排序索引构建使用"自下而上"的方法来构建索引。通过这种方法,对最右边的叶页的引用在B树的所有级别上都被保留。在必要的B树深度处分配最右边的叶页,并根据条目的排序顺序插入条目。一旦叶页已满,节点指针将附加到父页,并为下一次插入分配同级叶页。此过程将继续,直到插入所有条目,这可能会导致插入到根级别。分配同级页时,将释放对以前固定的叶页的引用,新分配的叶页将成为最右边的叶页和新的默认插入位置。
关注公众号- 编程highway - 获取更多好文和学习资料