索引通常是提高查询效率的最好方式,使用索引经常可以使查询效率提高几十倍、几百倍,甚至更多。
本人将Mysql索引归为两大类,按索引组织结构分类和按索引使用方式分类。
1、按索引组织结构分类
1.1 B+Tree索引
以下内容引用自:http://blog.csdn.net/tonyxf121/article/details/8393545
1.1.1 B-Tree
B-Tree介绍
B-Tree是一种多路搜索树(并不是二叉的):
(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] < K[i+1]
(7) 非叶子结点的指针:P[1], P[2], …, P[M], 其中P[1]指向关键字小于K[1]的子树,P[M]指向关键字大于K[M-1]的子树,其它P[i]指向关键字属于(K[i-1], K[i])的子树
(8) 所有叶子结点位于同一层
如:(M=3)
B-树的特性:
(1) 关键字集合分布在整颗树中
(2) 任何一个关键字出现且只出现在一个结点中
(3) 搜索有可能在非叶子结点结束
(4) 其搜索性能等价于在关键字全集内做一次二分查找
(5) 自动层次控制
树的搜索,从根结点开始,对结点内的关键字(有序)序列进行二分查找,如果命中则结束,否则进入查询关键字所属范围的儿子结点;
重复,直到所对应的儿子指针为空,或已经是叶子结点;
1.1.2 B+Tree
B+Tree介绍
B+树是B-树的变体,也是一种多路搜索树:
(1) 其定义基本与B-树同,除了:
(2) 非叶子结点的子树指针与关键字个数相同;
(3) 非叶子结点的子树指针P[i],指向关键字值属于[K[i], K[i+1])的子树(B-树是开区间);
(5) 为所有叶子结点增加一个链指针;
(6) 所有关键字都在叶子结点出现;
如:(M=3)
B+的搜索与B-树也基本相同,区别是B+树只有达到叶子结点才命中(B-树可以在非叶子结点命中),其性能也等价于在关键字全集做一次二分查找.
B+的特性:
(1) 所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的;
(2) 不可能在非叶子结点命中;
(3) 非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层;
(4) 更适合文件索引系统;
mysql中普遍使用B+Tree做索引,但在实现上又根据聚簇索引和非聚簇索引而不同。
(1) 聚簇索引
所谓聚簇索引,就是指主索引文件和数据文件为同一份文件,聚簇索引主要用在Innodb存储引擎中。在该索引实现方式中B+Tree的叶子节点上的data就是数据本身,key为主键,如果是一般索引的话,data便会指向对应的主索引,在B+Tree的每个叶子节点增加一个指向相邻叶子节点的指针,就形成了带有顺序访问指针的B+Tree。做这个优化的目的是为了提高区间访问的性能,例如图4中如果要查询key为从18到49的所有数据记录,当找到18后,只需顺着节点和指针顺序遍历就可以一次性访问到所有数据节点,极大提到了区间查询效率。
(2) 非聚簇索
非聚簇索引就是指B+Tree的叶子节点上的data,并不是数据本身,而是数据存放的地址。主索引和辅助索引没啥区别,只是主索引中的key一定得是唯一的。主要用在MyISAM存储引擎中,如下图:
1.2 R-Tree索引
R-Tree树的介绍来自百度百科:http://baike.baidu.com/view/5086047.htm?fr=aladdin
R树是B树 向多维空间发展的另一种形式,它将对象空间按范围划分,每个结点都对应一个区域和一个磁盘页,
非叶结点的磁盘页中存储其所有子结点的区域范围,非叶结点的 所有子结点的区域都落在它的区域范围之内;