MySQL索引初步

来源:互联网 发布:追梦格林常规赛数据 编辑:程序博客网 时间:2024/06/10 00:35

参考书籍:《高性能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]


上图是一个B-tree的例子。

2、B+Tree

B+Tree是B-Tree的一个变种,也是MySQL中实际用到的一种数据结构,他们的区别在于:

1)n棵子树的结点中含有n个关键字; (B-treen棵子树有n-1个关键字)

2)所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大的顺序链接。 (B-tree的叶子节点并没有包括全部需要查找的信息)

3)所有的非终端结点可以看成是索引部分,结点中仅含有其子树根结点中最大(或最小)关键字。 (B-tree的非终节点也包含需要查找的有效信息)


上图是一个B+Tree的例子。

3、哈希索引
哈希索引是基于哈希算法的一种精确的索引。在MySql中只有Memory引擎显示支持哈希索引,这也是Memory引擎的默认索引方式,它同时也支持B-Tree。值得一提的是它支持非唯一哈希索引,如果多个列的哈希值相同,则用一个链表存储。
因为哈希索引只存储哈希值,所以索引的结构十分的紧凑,者也是其查找速度非常的快,但同时也有了如下的问题:
1)哈希索引中只包含哈希值和数据指针,不包含数据分身。因而还需要查找一次数据。不过在内存中的插叙速度很快,这点可以忽略。
2)哈希索引并不是顺序存储的,所以无法进行排序。
3)哈希索引也不支持部分索引列的查找,因而哈希值是根据所有索引列计算的。
4)由于哈希值是个准确的值,所以只能进行等值查找,无法进行模糊查询
5)在有冲突的时候,效率会明显下降。

因而,虽然哈希索引能够带来很大的效率的提升,但是它只能在一些特定的场合进行使用。

0 0
原创粉丝点击