概述:
在数据库中, 经常会涉及到一个问题, 就是B树和B+树,涉及到这两个数据结构, 往往涉及到一个问题, 就是B树和B+树的树的高度要比平衡二叉树的高度低, 这会降低很多的磁盘IO操作.
都说可以降低磁盘IO, 那么怎么理解呢? -- 以下是自己的理解, 如有错误,欢迎指正.
理解:
B树和B+树是用来维护索引结构的, 当你查询一条数据的时候. 这些结构都是存储在磁盘当中.(假设没有提前导入到缓存中)
当我们涉及到一颗树的时候, 因为其存储在磁盘, 这个记录应该会记录在相应的表结构中, 根据这个记录,可以找到树的头结点.
这样,就可以将头结点读取到内存, 进行检索. 这其实就是一次磁盘IO. 当读取到头结点之后,因为其是链表的结构, 就可以根据头结点直到下一层节点存储在磁盘中的位置.(一棵树的节点在磁盘中不一定是连续存储的). 当你读取下一层节点的数据的时候, 就会涉及到又一次磁盘IO了.
如果以上面的方式读, 如果树的高度越高, 层级越多, 那么就会涉及到更多的磁盘IO. 也就会低效了.
那么,这里就会有一个问题, 为什么不一次性将树的节点都载入内存呢?其实就是说, 树的节点在磁盘中存储并不是连续的, 所以读取的时候你其实并不知道别的节点存储在哪个位置, 你只记录了当前的根节点在磁盘中存储的位置, 其余节点都是根据根节点逐层直到的.
比如: 第二层的节点的位置可以根据根节点得到, 同理第三层的节点可以根据第二层的节点得到.
这样其实就很明朗了, 如果使用二叉搜索树, 树的高度很高, 层级就会很大, 需要读取上一层来获取下一层存储的位置, 这样就会有很多的磁盘IO.而B树或者B+树是多叉自平衡树,一般树的高度只有三层, 这样涉及到的磁盘IO的数量就是3,明显磁盘IO的次数降低了(因为,一个节点可以存放更多节点的位置了)