b树索引和哈希索引的区别,这个问题相信有一部分小伙伴遇到,记得有一次小编面试时也被问过这个问题,这次我们就来解析解析。
首先我们来简单讲一下两者之间数据结构上的区别,哈希索引就是我们jdk里面的hashmap的结构,也就是数组加链表的情况,而b树索引就是一个平衡的多路的二叉树
再来来看看使用场景上的区别:
hash索引
1.只能使用=或<=>操作符的等式比较
2.优化器不能使用hash索引来加速order by操作
3.mysql不能确定在两个值之间大约有多少行。如果将一个myisam表改为hash索引的memory表,会影响一些查询的执行效率。
4.只能使用整个关键字来搜索一行。
而对于B树索引来说,<,>=,between,like 'pattern'(其中pattern不以通配符开始),之类的,都可以使用相关列上的索引。
然后这一切其实都是由于在数据结构上的差异。B树由于本身就是演化于二叉查找树,所以数据的存储本来就是有顺序的。所以在进行范围查询时就有极大的优势,数据都帮你排序好了,选边界就十分简单了。反观hash索引,它的hash算法是为了尽量减少冲突而产生的,所以它并不适合进行范围查询的操作,但如果是单个查询的话,由于hashmap的时间复杂度是一,所以十分快捷。
如果是等值查询,那么哈希索引明显有绝对优势,因为它只需要经过一次算法即可找到相应的键值;当然,它的前提是,键值都是唯一的。如果键值不是唯一的,就需要先找到该键所在位置,然后再根据链表往后扫描,直到找到相应的数据;
B+树索引的关键字检索效率比较平均,不像B树那样波动幅度大,在有大量重复键值情况下,哈希索引的效率也是极低的,因为存在所谓的哈希碰撞问题
hash结构的特点:检索效率非常高,索引的检索可以一次到位,O(1)。B树需要从根节点到枝节点,最后才能到叶节点进行多次I/O操作,所以hash的效率远远高于B树的效率。
所以总的来说,我们大部分情况下使用的都是B树索引,hash索引是极少数才会使用到的。
以上就是关于b树索引和哈希索引的区别的所有内容了,还有疑问并且想了解更多java架构师知识的小伙伴,可以来关注我们的网站了解详情。
推荐阅读: