vlambda博客
学习文章列表

mysql索引-hash和btree什么区别?

背景

    日常开发中,我们在创建mysql索引的时候经常有两种选择,BTREE和HASH,但其实很多同学不清楚到底BTREEHASH有什么区别,当然如果不深入去了解很多觉得差不多,其实这个差别还是挺大的。如下表格。

比较名称

hash

btree

备注

顺序

无序

有序

Btree数据是有序的,而hash是没有顺序的。

效率

较低

理论上hash查询效率较btree高。

索引排序

不支持

支持

hash不支持排序,btree支持。

部分索引

不支持

支持

hash不支持部分索引查询因为是无序的,而btree可以。

避免全表扫描

不支持

支持

hash任何时候都无法避免全表扫描,而btree可以。

hash的实现:hash是以key、value的形式存储,是通过hash索引计算出一个唯一的hash的key值,然后通过该key值进行全表匹配判断(组合索引也一样),查询出value值。这样的话虽然说效率很高,但是避免不了全表扫描,反而当数据量非常大的时候会导致哈希碰撞问题,性能就会比btree慢多了。

mysql索引-hash和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