mysql索引
索引
索引(Index)是帮助MySQL高效获取数据的数据结构。
最基本的查询算法当然是顺序查找(linear search),这种复杂度为O(n)的算法在数据量很大时显然是糟糕的,有更好的二分查找(binary search)、二叉树查找(binary tree search)等可以代替。
但每种查找算法都只能应用于特定的数据结构之上,例如二分查找要求被检索数据有序,而二叉树查找只能应用于二叉查找树上。
但是数据本身的组织结构不可能完全满足各种数据结构,所以,在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。
左边是数据表,一共有两列七条记录,最左边的是数据记录的物理地址。为了加快Col2的查找,可以维护一个右边所示的二叉查找树,每个节点分别包含索引键值和一个指向对应数据记录物理地址的指针,这样就可以运用二叉查找在O(log2n) 的复杂度内获取到相应数据。
B- B+
目前大部分数据库系统及文件系统都采用B-Tree或其变种B+Tree作为索引结构。
B-
为了描述B-Tree,首先定义一条数据记录为一个二元组[key, data],key为记录的键值,对于不同数据记录,key是互不相同的;data为数据记录除key外的数据。那么B-Tree是满足下列条件的数据结构:
1. d为大于1的一个正整数,称为B-Tree的度
2. h为一个正整数,称为B-Tree的高度
3. 每个非叶子节点由n-1个key和n个指针组成,其中d<=n<=2d
4. 每个叶子节点最少包含一个key和两个指针,最多包含2d-1个key和2d个指针,叶节点的指针均为null
5. 所有叶节点具有相同的深度,等于树高h
6. 每个指针要么为null,要么指向另外一个节点
7. h为hi的指针pi其左边key为ki-1右边key为ki+1,那么pi指向的节点中,所有key>ki-1并且key<ki+1
下图为d=2的一个B-树:
由于B-Tree的特性,在B-Tree中按key检索数据的算法非常直观:首先从根节点进行二分查找,如果找到则返回对应节点的data,否则对相应区间的指针指向的节点递归进行查找,直到找到节点或找到null指针,前者查找成功,后者查找失败。
另外,由于插入删除新的数据记录会破坏B-Tree的性质,因此在插入删除时,需要对树进行一个分裂、合并、转移等操作以保持B-Tree性质。
B+
与B-的不同&#x