介绍:
索引的数据结构和
具体存储引擎
的实现有关,在MySQL中使⽤较多的索引有
Hash
索引,
B+树
索引等
InnoDB
存储引擎的默认索引实现为:
B+树索引
。对于哈希索引来说,底层的数据结构就是
哈希表
,因此在绝⼤多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;其余⼤部分场景,建议选择BTree索引。
B+树:
B+树是⼀个平衡的多叉树,从根节点到每个叶⼦节点的
⾼度差值不超过1
,⽽且同层级的节点间
有指针相互链接。在B+树上的常规检索,从根节点到叶⼦节点的搜索效率基本相当,不会出现⼤幅波动,⽽且基于索引的顺序扫描时,也可以利⽤
双向指针
快速左右移动,效率⾮常⾼。因此,B+树索引被⼴泛应⽤于数据库、⽂件系统等场景。
哈希索引:
哈希索引就是采⽤⼀定的
哈希算法
,把键值换算成新的哈希值,检索时不需要类似B+树那样
从根节点到叶⼦节点逐级查找,只需⼀次哈希算法即可⽴刻定位到相应的位置,速度⾮常快
区别:
如果是
等值查询
,那么哈希索引明显有绝对优势,因为只需要经过⼀次算法即可找到相应的键值;前提是键值都是唯⼀的。如果键值不是唯⼀的,就需要先找到该键所在位置,然后再根据
链表
往后扫描,直到找到相应的数据;
如果是范围查询检索,这时候哈希索引就毫⽆⽤武之地了,因为原先是有序的键值,经过哈希算法后,有可能变成不连续的了,就没办法再利⽤索引完成范围查询检索;
哈希索引也没办法利⽤索引完成排序,以及like ‘xxx%’ 这样的部分模糊查询(这种部分模糊查询,其实本质上也是范围查询);
哈希索引也不⽀持多列联合索引的最左匹配规则;
B+树索引的关键字检索效率⽐较平均,不像B树那样波动幅度⼤,在有⼤量重复键值情况下,哈希索引的效率也是极低的,因为存在哈希碰撞问题。