mysql的 b 树和哈希区别_Mysql InnoDB B+树索引和哈希索引的区别? MongoDB 为何使用B-树?...

B-树和B+树最重要的一个区别就是B+树只有叶节点存放数据,其他节点用来索引,而B-树是每一个索引节点都会有Data域。html

B+树

B+树是为磁盘及其余存储辅助设备而设计一种平衡查找树(不是二叉树)。B+树中,全部记录的节点按大小顺序存放在同一层的叶节点中,各叶节点用指针进行链接。程序员

数据库中B+树索引分为汇集索引(clustered index)和非汇集索引(secondary index).这两种索引的共同点是内部都是B+树,高度都是平衡的,叶节点存放着全部数据。不一样点是叶节点是否存放着一整行数据。web

B+树有以下特色:面试

B+树每一个节点能够包含更多的节点,这样作有两个缘由,一个是下降树的高度。另一个是将数据范围变为多个区间,区间越多,数据检索越快。

每一个节点再也不只是存储一个key了,能够存储多个key。

非叶子节点存储key,叶子节点存储key和数据。

叶子节点两两指针相互连接,顺序查询性能更高。

通俗的讲

- B+树的非叶子节点只是存储key,占用空间很是小,所以每一层的节点能索引到的数据范围更加的广。换句话说,每次IO操做能够搜索更多的数据。

- 叶子节点两两相连,符合磁盘的预读特性。好比叶子节点存储50和55,它有个指针指向了60和62这个叶子节点,那么当咱们从磁盘读取50和55对应的数据的时候,因为磁盘的预读特性,会顺便把60和62对应的数据读取出来。这个时候属于顺序读取,而不是磁盘寻道了,加快了速度。

- 支持范围查询,并且部分范围查询很是高效,每一个节点能索引的范围更大更精确,也意味着 B+树单次磁盘IO的信息量大于B-树,I/O效率更高。算法

缘由是数据都是存储在叶子节点这一层,而且有指针指向其余叶子节点,这样范围查询只须要遍历叶子节点这一层,无需整棵树遍历。sql

局部性原理与磁盘预读

因为磁盘的存取速度与内存之间鸿沟,为了提升效率,要尽可能减小磁盘I/O.磁盘每每不是严格按需读取,而是每次都会预读,磁盘读取完须要的数据,会顺序向后读必定长度的数据放入内存。而这样作的理论依据是计算机科学中著名的局部性原理:mongodb

当一个数据被用到时,其附近的数据也一般会立刻被使用,程序运行期间所须要的数据一般比较集中数据库

B-树

B-树,这里的 B 表示 balance( 平衡的意思),B-树是一种多路自平衡的搜索树

它相似普通的平衡二叉树,不一样的一点是B-树容许每一个节点有更多的子节点。segmentfault

B-树有以下特色微信

全部键值分布在整颗树中。

任何一个关键字出现且只出如今一个结点中。

搜索有可能在非叶子结点结束。

在关键字全集内作一次查找,性能逼近二分查找。

B-树和B+树的区别

B+树内节点不存储数据,全部数据存储在叶节点致使查询时间复杂度固定为 log n。

B-树查询时间复杂度不固定,与 key 在树中的位置有关,最好为O(1)。

B+树叶节点两两相连可大大增长区间访问性,可以使用在范围查询等。

B-树每一个节点 key 和 data 在一块儿,则没法区间查找。

B+树更适合外部存储(存储磁盘数据)。因为内节点无 data 域,每一个节点能索引的范围更大更精确。

MongoDB 为何使用B-树?

B+树内节点不存储数据,全部 data 存储在叶节点致使查询时间复杂度固定为 log n。而B-树查询时间复杂度不固定,与 key 在树中的位置有关,最好为O(1)

咱们说过,尽量少的磁盘 IO 是提升性能的有效手段。MongoDB 是聚合型数据库,而 B-树刚好 key 和 data 域聚合在一块儿。

至于MongoDB为何使用B-树而不是B+树,能够从它的设计角度来考虑,它并非传统的关系性数据库,而是以Json格式做为存储的nosql,目的就是高性能,高可用,易扩展。首先它摆脱了关系模型,上面所述的优势2需求就没那么强烈了,其次Mysql因为使用B+树,数据都在叶节点上,每次查询都须要访问到叶节点,而MongoDB使用B-树,全部节点都有Data域,只要找到指定索引就能够进行访问,无疑单次查询平均快于Mysql。

哈希索引

简单地说,哈希索引就是采用必定的哈希算法,把键值换算成新的哈希值,检索时不须要相似B+树那样从根节点到叶子节点逐级查找,只需一次哈希算法便可马上定位到相应的位置,速度很是快。

B+树索引和哈希索引的区别

若是是等值查询,那么哈希索引明显有绝对优点,由于只须要通过一次算法便可找到相应的键值;固然了,这个前提是,键值都是惟一的。若是键值不是惟一的,就须要先找到该键所在位置,而后再根据链表日后扫描,直到找到相应的数据。

若是是范围查询检索,这时候哈希索引就毫无用武之地了,由于原先是有序的键值,通过哈希算法后,有可能变成不连续的了,就没办法再利用索引完成范围查询检索。

同理,哈希索引也没办法利用索引完成排序,以及like ‘xxx%’ 这样的部分模糊查询(这种部分模糊查询,其实本质上也是范围查询)。

哈希索引也不支持多列联合索引的最左匹配规则。

B+树索引的关键字检索效率比较平均,不像B树那样波动幅度大,在有大量重复键值状况下,哈希索引的效率也是极低的,由于存在所谓的哈希碰撞问题。

备注:以上内容均摘抄自网络,并不是原创,仅供我的学习交流使用,望各路大牛,发现不对的地方,不吝赐教,留言便可。

参考

推荐阅读

关注微信公众号福利

关注微信公众号「搜云库」获取最新文章

【福利】公众号后台回复 “进群”

【福利】邀请您进微信 “技术分享群”

【福利】群里有不少技术大佬,免费提问,互相学习

d7c5551f2b2645f6a4183725.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值