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慢多了。

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


免责声明:

1、本站资源由自动抓取工具收集整理于网络。

2、本站不承担由于内容的合法性及真实性所引起的一切争议和法律责任。

3、电子书、小说等仅供网友预览使用,书籍版权归作者或出版社所有。

4、如作者、出版社认为资源涉及侵权,请联系本站,本站将在收到通知书后尽快删除您认为侵权的作品。

5、如果您喜欢本资源,请您支持作者,购买正版内容。

6、资源失效,请下方留言,欢迎分享资源链接

文章评论

0条评论