在MySQL中,主要使用到两种索引,分别是hash索引和B+Tree索引,在常用的两种搜索引擎MyISAM和InnoDB中默认的都是使用B+Tree索引,也就是BTree。
InnoDB中是无法显式的使用hash索引,即使你定义了hash索引,看到的也是B+Tree索引,系统会在需要用到hash索引的列中,自动的为你使用hash索引。
hash索引:
采用一定的哈希算法,将键值换算成新的哈希值,检索时只需要经过一次哈希算法就能定位到相应的位置,速度相当快。
1、如果是等值查询,使用hash索引优势非常明显,不过前提是键值唯一,重复的键值(哈希碰撞,会把相同的哈希值通过链表连接起来)需要先找到键所在的位置,然后通过链表往后扫描,直到找到相应的数据。例如,在性别、年龄的列上就不适合使用hash索引,因为有大量重复的值。
2、如果是范围查询,那么hash索引将毫无用处,因为经过hash算法之后,就可能变成不连续的了,就没法使用索引完成范围的检索了。
3、也不支持最左匹配规则,例如:LIKE ‘%xxx’。
B+Tree索引:
1、B+Tree非叶子节点是不存储数据的,也就是数据都存储在叶子节点上,并且是按顺序存储的,也就是说,如果进行范围扫描会比hash更好。
2、由于根节点是存储在内存中的,查询一个数据,最多只需要1-3次磁盘IO即可。