hash虽然可以快速定位,但是没有顺序,IO复杂度高。如果只选一个数据,那确实是hash更快。但是数据库中经常会选择多条,这时候由于B+树索引有序,并且又有链表相连,它的查询效率比hash就快很多了。而且数据库中的索引一般是在磁盘上,数据量大的情况可能无法一次装入内存,B+树的设计可以允许数据分批加载,同时树的高度较低,提高查找效率。 hash表只能匹配是否相等,不能实现范围查找,因为原先是有序的键值,经过哈希算法后,有可能变成不连续的了,就没办法再利用索引完成范围查询检索。 当需要按照索引进行orderby的时候,hash值没办法支持排序,因为hash散列的特性,无法利用索引完成排序。 组合索引可以支持部分索引查询,如(a,b,c)的组合索引,查询中只用到了a和b也可以查询,如果使用hash表,组合索引会将几个字段合并hash,没办法支持部分索引。 当数据量很大的时候,hash冲突的概率也很大,特别是在有大量重复键值的情况下,哈希索引的效率是非常低的,因为存在哈希碰撞问题。