总所周知,数据库查询优化离不开索引,虽然它是个简单的东西,可是其中却大有学问。
因追求极简,直接讲解其中原理
先来讲解一下索引的优缺点叭,一句话就可以概括,以空间换时间。
MySql 创建索引过程:首先进行该字段的排序,再生成叶子节点,再生成枝节点,最后生成根节点。
整个索引的结构就生成完毕了,如下图:
举个例子:有100条数据,ID为1-100,以这个ID建立索引,我们来查找ID在50-73之间的数据集合,
如图中红色箭头所示,只需要5次IO就可以查询出需要的数据。
索引分两种,聚簇索引和非聚簇索引,首先我们来看第一种
聚簇(区)索引:
- 如果表中设置了主键(例如ID列),自动根据ID列生成索引树
- 如果没有设置主键,自动选择第一个唯一键的列作为聚簇索引
- 自动生成隐藏的聚簇索引
接下来我们看看B-Tree的构建过程:
- 叶子节点: 存储数据行时就是有序的,直接将数据行的page作为叶子节点(相邻的叶子结点,有双向指针)
- 枝节点 : 提取叶子节点ID的范围+指针,构建枝节点(相邻枝节点,有双向指针)
- 根节点 : 提取枝节点的ID的范围+指针,构建根节点
接下来,来看看数据库实际数据存放: