索引的数据结构和具体存储引擎的实现有关,MySQL中使用较多的有Hash索引和B+树索引。
InnoDB引擎使用B+树索引;Memory引擎使用Hash索引。
B+树是一个平衡多叉树,从根节点到每个叶子节点的高度差不超过1,而且同层级的节点之间有指针连接,在B+树上的常规检索,从根节点到叶子节点的搜索效率基本相当,不会出现大幅波动,而且基于索引的顺序扫描时,也可以利用双向指针快速左右移动,效率非常高。因此,B+树被广泛应用于数据库、文件系统等场景。
Hash索引就是采用一定的hash算法,把键值换算成新的hash值,检索时不需要像B+树这样从根节点到叶子节点逐级查找,只需一次hash算法即可定位,速度非常快。
如果是等值查询,那么hash索引有明显优势,前提是健值都是唯一的,如果健值不唯一,那就需要先找到健的位置,然后再扫描链表,找到对应的值。
如果是范围擦汗寻,hash索引就不好用了,因为原先有序的键值在hash计算后变得不再连续,没办法再利用索引完成范围检索。
hash索引也不能进行排序或者like匹配。hash索引也不支持多列联合索引得最左匹配规则。
B+树索引得关键字检索效率比较平均,不像B+树那样波动大,在有大量重复键值得情况下,hash索引效率也是极低的,因为存在hash碰撞的问题。