2

B树和B+树

[TOC]

参考:B树、B+树详解

前言

B+ 树是一种存储结构,常用在数据库建立索引。

准备知识

m阶的树:树最大分叉有m个,即子节点数最大为m个;

根节点:没有父节点的节点;

叶节点:没有子节点的节点;

内部节点:不是根、叶节点的节点;

二叉搜索树:左子树中的值要比根节点值 ,右子树中的值要比根节点值

平衡二叉树:二叉搜索树的特殊情况,左右子树高度一样;

一、B树

B数是平衡叉树,一个m阶的B树,有如下特性:

  1. 内部节点最少得有ceil(m/2)个子节点;
  2. 根节点不是叶节点时,至少得有2个子节点,即2阶;
  3. m阶的节点中包含m-1个数据
  4. 所有叶子节点高度一致;

B树结构

二、B+树

B+树是B树变体,对其规则做了些改变。改变如下:

  1. 叶子结点由一个有序数组和指向其右边一个叶子结点的指针组成;
  2. 非叶子节点由一个有序数组组成,但是数组元素由一个索引值一个指针组成;

    1. 指针:指向一个叶子节点;
    2. 索引值:指向的那个叶子节点中最小的索引值;
  3. 非叶节点,是工具节点,用于快速找到指定叶节点,只有叶节点才存储真正的数据(一行数据);
  4. 叶子节点们类似一个有序链表;
  5. m阶的节点中包含m个数据;

B+树结构

注:mysql B+树的叶子结点是一个双链表,且尾部叶子节点还指向头部叶子节点。

2.1 为什么B+树适合数据库?

  1. B+树便于范围查询,这是最主要的。

只需要查找最左边范围即可,查到后遍历往右遍历叶子结点,知道碰到右边范围结束,这样就筛出了所有范围内数据。

B树的范围查找用的是中序遍历,而B+树用的是在链表上遍历;

  1. B+树的磁盘读写代价更低。

Mysql最小存储单位为页,每次访问数据都是一页一页加载(访问一页就是一次IO),Mysql的索引树建立自然就是以页为单位,即一个节点就是一页。由于B+树在非叶子节点仅存储索引数据,那么读一页数据,即一次性读入内存中的需要查找的关键字也就越多,相对来说IO读写次数也就降低了;

  1. B+树查询效率更加稳定

由于非叶子节点并不是最终指向文件内容的结点,所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当;


Diuyon
67 声望148 粉丝

下一篇 »
Mysql Log 介绍