背景
日常开发中,我们在创建mysql索引的时候经常有两种选择,BTREE和HASH,但其实很多同学不清楚到底BTREE和HASH有什么区别,当然如果不深入去了解很多觉得差不多,其实这个差别还是挺大的。如下表格。
比较名称 | hash | btree | 备注 |
---|---|---|---|
顺序 | 无序 | 有序 | Btree数据是有序的,而hash是没有顺序的。 |
效率 | 高 | 较低 | 理论上hash查询效率较btree高。 |
索引排序 | 不支持 | 支持 | hash不支持排序,btree支持。 |
部分索引 | 不支持 | 支持 | hash不支持部分索引查询因为是无序的,而btree可以。 |
避免全表扫描 | 不支持 | 支持 | hash任何时候都无法避免全表扫描,而btree可以。 |
hash的实现:hash是以key、value的形式存储,是通过hash索引计算出一个唯一的hash的key值,然后通过该key值进行全表匹配判断(组合索引也一样),查询出value值。这样的话虽然说效率很高,但是避免不了全表扫描,反而当数据量非常大的时候会导致哈希碰撞问题,性能就会比btree慢多了。
btree的实现:btree也称为b+树,主要的实现是通过一个平衡二叉树进行判断范围查询,如下图:,btree的性能比较稳定,不会出现很大的波动,也不会出现hash的碰撞问题,基于索引的顺序扫描,也可以利用双向指针快速左右移动,效率非常高。
最后
btree适用于大部分的场景,并且也是非常实用,虽然说除了在少量数据量场景下,性能不如hash其它的特性与性能远超hash,而且很多开源的数据管理平台或系统都是借鉴btree的原理进行实现比如:mongo,当然对于研发人员,对于技术的了解不单单只停留在表面使用更多时候还是需要深入。
参考:
https://zhuanlan.zhihu.com/p/58292748
https://zhuanlan.zhihu.com/p/350020687
https://dev.mysql.com/doc/refman/5.6/en/index-btree-hash.html
https://www.cnblogs.com/baizhanshi/p/11084539.html
https://www.yidianphp.com/archives/811
https://www.jb51.net/article/196398.htm
https://www.cnblogs.com/hickup089/p/15337284.html