MySQL优化查询之B+树

树的话,无非就是前中后序遍历、二叉树、二叉搜索树、平衡二叉树,更高级一点的有红黑树、B树、B+树,字典树。

树的查找性能取决于树的高度,让树尽可能平衡是为了降低树的高度。

B树

B树是一种多路搜索树,它的每个节点都可以拥有多于两个孩子节点。M路的B树最多拥有M个孩子节点,设计成多路是为了降低树的高度。

B树一般使用于文件系统的索引,文件系统和数据库的索引都是存在硬盘上的。并且如果数据量大的话,不一定能一次性加载到内存中。B树的多路存储是为了可以每次加载B树的一个节点,然后一步步往下找。

红黑树

红黑树是平衡树的一种,它复杂的定义和规则都是为了保证树的平衡性。

如果是红黑树的话,每个节点只有一个数,那么对于树的高度就会比B树的高(B树一般每个节点会存储很多数(Key)),这样的话,每次读入一个节点都会进行一次IO,所以红黑树由于树的高度太高而进行了太多的磁盘IO不可取(磁盘IO的次数和树的高度有关)。

在内存中红黑树比B树效率更高,但是涉及到磁盘操作B树就更优了。

B+树

B+树是在B树的基础上进行改造,它的数据都在叶子节点,同时叶子节点之间还加了指针形成链表。

select查询如果是多条的话,B树需要做局部的中序遍历,可能要跨层访问。而B+树由于所有数据都在叶子结点,不用跨层,同时由于有链表结构,只需要找到首尾,通过链表就能把所有数据取出来了。

在进行范围查询的时候,比如 select * from where id <= 7 and id >= 19,如果是B树,此时遍历整个B树很多次,一一找到那些 id 符合条件的所有节点,然后再找到你所需要的信息。而B+树只需要从根节点找到起始位置(id=7),然后顺着链表一直遍历,直到终止位置(id=19);

查找的数字都是都是索引(Key),而你所要查找的值也就是你要select的东西,根据不同的存储引擎存储的位置不一样,MyISAM是在叶子节点存储一个指针,指向你所要查找的数据,而InnoDB是直接存储在叶子节点的(也就是说索引和你要查的数据在一块)。

总结:所以和业务场景有关。如果只选一个数据,那确实是hash更快。但是数据库中经常会选择多条,这时候由于B+树索引有序,并且又有链表相连,它的查询效率比hash就快很多了。而且数据库中的索引一般是在磁盘上,数据量大的情况可能无法一次装入内存,B+树的设计可以允许数据分批加载,同时树的高度较低,提高查找效率。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值