mysql索引本质
MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是一种数据结构。
数据库查询是数据库的主要功能之一,最基本的查询算法是顺序查找(linear search)时间复杂度为O(n),显然在数据量很大时效率很低。优化的查找算法如二分查找(binary search)、二叉树查找(binary tree search)等,虽然查找效率提高了。但是各自对检索的数据都有要求:二分查找要求被检索数据有序,而二叉树查找只能应用于二叉查找树上,但是数据本身的组织结构不可能完全满足各种数据结构(例如,理论上不可能同时将两列都按顺序进行组织)。所以,在数据之外,数据库系统还维护着满足特定查找算法的数据结构。这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构就是索引。
B-tree和B+tree
B-Tree
为了描述B-Tree,首先定义一条数据记录为一个二元组[key, data],key为记录的键值,对于不同数据记录,key是互不相同的;data为数据记录除key外的数据。那么B-Tree是满足下列条件的数据结构:
- d>=2,即B-Tree的度;
- h为B-Tree的高;
- 每个非叶子结点由n-1个key和n个指针组成,其中d<=n<=2d;
- 每个叶子结点至少包含一个key和两个指针,最多包含2d-1个key和2d个指针,叶结点的指针均为NULL;
- 所有叶结点都在同一层,深度等于树高h;
- key和指针相互间隔,结点两端是指针;
- 一个结点中的key从左至右非递减排列;
- 如果某个指针在结点node最左边且不为null,则其指向结点的所有key小于
- 如果某个指针在结点node最右边且不为null,则其指向结点的所有key大于
- 如果某个指针在结点node的左右相邻key分别是
B+Tree有以下不同点:
- 每个结点的指针上限为2d而不是2d+1。
- 内结点不存储data,只存储key;叶子结点不存储指针
由于并不是所有节点都具有相同的域,因此B+Tree中叶结点和内结点一般大小不同。这点与B-Tree不同,虽然B-Tree中不同节点存放的key和指针可能数量不一致,但是每个结点的域和上限是一致的,所以在实现中B-Tree往往对每个结点申请同等大小的空间。