mysql索引默认是哈希还是B树_哈希索引和B树索引的区别

参考:《深入浅出mysql》

今天有个面试,问到了这个问题,然后忽然发现我没有思考过这个问题,就单纯的解释了结构上的区别,而使用场景上的一下子啥都没反应过来,尴尬。

首先简单讲一下数据结构上的区别吧,哈希索引就是我们jdk里面的hashmap的结构,也就是数组加链表的情况,而B树索引就是一个平衡的多路的二叉树(不熟悉的同学可以找本数据结构和算法的书来看看 由浅入深浅谈B+树 这是我以前写的简单介绍)

然后来看看使用场景上的区别:

首先看hash索引:

1.只能使用=或<=>操作符的等式比较

2.优化器不能使用hash索引来加速order by操作

3.mysql不能确定在两个值之间大约有多少行。如果将一个myisam表改为hash索引的memory表,会影响一些查询的执行效率。

4.只能使用整个关键字来搜索一行。

而对于B树索引,=,between,like 'pattern'(其中pattern不以通配符开始),之类的,都可以使用相关列上的索引。

然后这一切都是由于在数据结构上的差异。B树由于本身就是演化于二叉查找树,所以数据的存储本来就是有顺序的。所以在进行范围查询时就有很大的优势,数据都帮你排序好了,选边界啥的还不简单嘛。而反观hash索引,它的hash算法是为了尽量减少冲突而产生的,所以它并不适合进行范围查询的操作,但如果是单个查询的话,由于hashmap的时间复杂度是一,所以就特别快。

然后大家可以用explain查看一下在两种索引的情况下分别进行范围查询,可以发现B树索引下会使用索引,而hash索引实际上使用的是全表扫描,建立起来的索引并没有使用。

然后,可以理解比如最左前缀原则啥的在hash索引下更实用不了了。

所以总的来说,我们大部分情况下使用的都是B树索引,hash索引是极少数才会使用到的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值