hash索引结构 哈希索引就是采用一定的hash算法,将键值换算成新的hash值,映射到对应的槽位上,然后存储在hash表中 当数据量比较大时,出现两个相同的hash值,也就是出现两个(或多个)键值,映射到一个相同的槽位上,他们就产生了hash冲突(也称为hash碰撞),可 以通过链表来解决,解决的原理就是在一个槽位上延伸出一个槽位,并指向这个延伸出的槽位,还可继续一条直线上延伸多个槽位,这多个槽位是同一方向的 指向,这个槽位和延伸出来的若干个槽位就形成了链表

 

hash索引特点

1、hash索引只能用于对等比较(=,in)也叫等值匹配,不支持范围查询(between,>,>,...),不支持范围查询是因为hash表的存储是无序的

2、无法利用索引完成排序操作,原因是hash表的存储是无序的

3、查询效率高,通常只需要一次检索就可以了(当不出现hash碰撞的情况下),效率通常要高于B+tree索引

 

哪些存储引擎支持hash索引 在MySQL中,支持hash索引的是Memory引擎,其它引擎目前不支持。但是在InnoDB引擎中具有自适应hash功能,自适应功能指的是MySQL会 根据我们的查询条件会自动地将B+树索引构建为hash索引

 

思考 为什么InnoDB存储引擎选择使用B+tree索引结构,而没有采用二叉树或红黑树或B树或hash索引

1、相对于B+tree来说,InnoDB没有采用二叉树或红黑树的原因 红黑树的本质是二叉树,在数据量相同的情况下,B+tree的层级更少,搜索效率高

2、相对于B+tree来说,InnoDB没有采用B树的原因 B+tree只在最底部的叶子节点才存放数据,上面的交叉节点仅仅是起到索引的作用。B树不管是最底部的叶子节点,还是其他交叉节点都会存放数据 又因为一个节点最终是通过一个磁盘块(或叫一页)来存放的,一页的大小是固定16k(即空余空间初始是16k,放满就不能再放),对于B树,无论是交叉 节点还是底部的叶子节点,都会保存数据,这样就导致一页中存储的键值减少,指针跟着减少,当要同样保存大量数据时,B树就只能增加树的高度, 会造成B树性能降低,所以选择B+tree树。第二个原因就是在B+tree的最底部的叶子节点之间是双向的链表,便于范围搜索和排序

3、相对于B+tree来说,InnoDB没有采用hash索引的原因 因为hash索引只支持等值匹配,不支持范围匹配以及排序操作,B+tree是支持范围匹配以及排序操作