B-Tree
相对于AVLTree
缩减了节点个数,使每次磁盘I/O取到内存的数据都发挥了作用,从而提高了查询效率。
4. B+树索引
B+Tree是在B-Tree基础上的一种优化,使其更适合实现外存储索引结构,B+树的性质:
1、非叶子节点的子树指针与关键字个数相同;
2、为所有叶子节点增加一个链指针;
3、所有关键字都在叶子节点出现, 且链表中的关键字恰好是有序的;
4、非叶子节点相当于是叶子节点的索引,叶子节点相当于是存储(关键字)数据的数据层;
InnoDB存储引擎就是用B+Tree实现其索引结构。
从上一节中的B-Tree结构图中可以看到每个节点中不仅包含数据的key值,还有data值。而每一个页的存储空间是有限的,如果data数据较大时将会导致每个节点(即一个页)能存储的key的数量很小,当存储的数据量很大时同样会导致B-Tree的深度较大,增大查询时的磁盘I/O次数,进而影响查询效率。在B+Tree中,所有数据记录节点都是按照键值大小顺序存放在同一层的叶子节点上,而非叶子节点上只存储key值信息,这样可以大大加大每个节点存储的key值数量,降低B+Tree的高度。
B+Tree相对于B-Tree有几点不同:
1、非叶子节点只存储键值信息和指向子节点页号的指针;
2、所有叶子节点之间都有一个链指针;
3、数据记录都存放在叶子节点中;
根据上图我们来看下 B+ 树和 B 树有什么不同:
(1) B+ 树非叶子节点上是不存储数据的,仅存储键值,而 B 树节点中不仅存储键值,也会存储数据。
页的大小是固定的,InnoDB 中页的默认大小是 16KB。如果不存储数据,那么就会存储更多的键值,相应的树的阶数就会更大,树就会更矮更胖,如此一来我们查找数据进行磁盘的 IO 次数又会再次减少,数据查询的效率也会更快。
另外,如果我们的 B+ 树一个节点可以存储 1000 个键值,那么 3 层 B+ 树可以存储 1000×1000×1000=10 亿个数据。一般根节点是常驻内存的(第一次检索根节点不用读取磁盘),所以一般我们查找 10 亿数据,只需要 2 次磁盘 IO。
(2) B+ 树索引的所有数据均存储在叶子节点,而且数据是按照顺序排列的。
B+ 树中各个页之间是通过双向链表连接的,叶子节点中的数据是通过单向链表连接的,通过这种方式可以找到表中的所有数据。B+ 树使得范围查找,排序查找,分组查找以及去重查找变得异常简单。而 B 树因为数据分散在各个节点,要实现这一点是很不容易的。
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注的更多内容!
更多相关Mysql内容来自木庄网络博客
标签:Mysql
相关阅读 >>
更多相关阅读请进入《mysql》频道 >>
数据库系统概念 第6版
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。