转自博客http://www.amogoo.com/article/4
前提
1,为了与时俱进,文中数据库环境为MySQL5.6版本
2,为了通用,更为了避免造数据的痛苦,文中所涉及表、数据,均来自于MySQL官网提供的示例库employees,可通过 https://launchpad.net/test-db/employees-db-1/1.0.6 自行下载。
基本概念
Binary search(二分查找法,折半查找法):是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。
(以上摘自 http://en.wikipedia.org/wiki/Binary_search_algorithm )
如下图:
B-tree(Btree、B树、B-树):指的是多路查找树,有别于二叉查找树(Binary Search Tree)、平衡二叉查找树(Balanced Binary Search Tree)。此处的B可理解成Balanced(注1)。
对于一颗M阶的树:
1,定义任意非叶子节点最多只有M个儿子;且M>2;
2,根节点的儿子数为[2, M];
3,除根节点以外的非叶子节点的儿子数为[M/2, M];
4,每个节点存放至少M/2-1(取上整)和至多M-1个关键字;(至少2个关键字)
5,非叶子节点的关键字个数=指向儿子的指针个数-1;
6,非叶子节点的关键字:K[1], K[2], …, K[M-1];且K[i]
7,非叶子节点的指针:P[1], P[2], …, P[M];其中P[1]指向关键字小于K[1]的子树,P[M]指向关键字大于K[M-1]的子树,其它P[i]指向关键字属于(K[i-1], K[i])的子树;
8,所有叶子节点位于同一层;
如下图:
B+-tree(B+tree、B+树):也是多路查找树,为B-tree的变形,在B-tree的基础上将叶节点打通,加上指向兄弟节点的指针,形成双向链表。叶节点的打通,使得只需遍历叶节点就可以实现整棵树的遍历,而无需像B-tree一样必须回到根枝节点再访问叶节点,对应数据库中范围查询,大大提高了IO性能。此为MySQL的B-tree索引结构。如下图: