索引较快的方式首先想到的就是二叉树,但是二叉树分布不均匀,容易形成部分链表,之后想到可以使用平衡二叉树,但是平衡二叉树也不行,原因如下:
操作系统与磁盘一次数据交换的单位是页,一页4K,即每次IO操作都会将4K内容加载到内存中,但是二叉树每个节点只保存一个关键字,一个数据区,两个子节点的引用,不够填满4K的空间,辛苦做了一次IO,却只加载了一个关键字,在树的高度很高,恰好又搜索的关键字位于叶子节点或者支节点的时候,取一个关键字要做很多次的IO,这显然是很耗费性能的。
为了解决这个问题,便使用B+树,即多路树解决这个问题, B+树作为索引的特点:
- 多路树,树的高度比较矮,减少磁盘IO
- 叶子节点自成链表,范围查询及排序走索引(排除执行优化)
-
B+树结构
注意
- B+树返回查询和order by 都走索引
- 用explain验证的时候有时没有走索引是因为执行引擎会根据数据量及IO等方面自动判定是否走索引,例如查询的数据量本身很小,就不需要走索引,或者走索引处理会更耗时,就选择全表扫描。