参考书籍:《高性能MySQL(第三版)》
索引对于数据库就像目录对于书籍。索引对良好的性能非常关键,尤其是当表中的数据越来越多的时候,索引对性能的影响愈发重要。索引优化对于优化查询来说是最重要的一个手段了, best索引比一个good索引能优化两个数量级的性能,由此可见一斑。
一、索引的类型
MySQL中的索引是在存储引擎层面实现的,因而没有统一的标准,这里忽略掉这些,只关心MySQL索引用到的数据类型。
1、B-Tree
在学习数据结构的时候,我们知道树这种数据结构经常会用来进行查询的操作,比如二叉树,平衡树,红黑树,还有b树,它可以把查询的时间复杂度优化到对数级别。
一般来说,索引本身也很大,不可能完全存放在内存中,所以一般是以索引文件的方式存储在磁盘中,因而,在进行索引查询的时候就会牵扯到磁盘的I/O,而对磁盘的I/O操作的时间远比内存操作要高几个数量级,所以要找一中能够有效减少磁盘I/O的数据结构,这就是多路查找树。
B-Tree的可以按照如下的定义:
1)树中每个节点至多有m个子节点
2)除根节点和叶节点之外,每个节点至少有m/2个子节点
3)所有叶节点都在同一层
4)每个非叶节点中包含n个关键字:
a)关键字是有序的
b)Pi是指向子树的指针,这个子树的所有关键字都小于Ki,但都大于Ki-1
c)关键字的个数在区间[m/2,m-1]
2、B+Tree
B+Tree是B-Tree的一个变种,也是MySQL中实际用到的一种数据结构,他们的区别在于:
1)有n棵子树的结点中含有n个关键字; (B-tree是n棵子树有n-1个关键字)
2)所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大的顺序链接。 (B-tree的叶子节点并没有包括全部需要查找的信息)
3)所有的非终端结点可以看成是索引部分,结点中仅含有其子树根结点中最大(或最小)关键字。 (B-tree的非终节点也包含需要查找的有效信息)