MySQL索引类型

在MySQL中,主要有四种类型的索引,分别为:B-Tree索引,Hash索引,Fulltext索引和R-Tree索引。

一、B-Tree索引

B-Tree索引是MySQL数据库中使用最为频繁的索引类型,除了Archive存储引擎之外的其他所有的存储引擎都支持B-Tree索引。不仅仅在MySQL中是如此,实际上在其他的很多数据库管理系统中B-Tree索引也同样是作为最主要的索引类型,这主要是因为B-Tree索引的存储结构在数据库的数据检索中有非常优异的表现。

一般来说,MySQL中的B-Tree索引的物理文件大多都是以Balance Tree的结构来存储的,也就是所有实际需要的数据都存放于Tree的Leaf Node,而且到任何一个Leaf Node的最短路径的长度都是完全相同的,所以我们大家都称之为B-Tree索引。当然,可能各种数据库(或MySQL的各种存储引擎)在存放自己的B-Tree索引的时候会对存储结构稍作改造。如Innodb存储引擎的B-Tree索引实际使用的存储结构实际上是B+Tree,也就是在B-Tree数据结构的基础上做了很小的改造,在每一个Leaf Node上面除了存放索引键的相关信息之外,还存储了指向与该Leaf Node相邻的后一个Leaf Node的指针信息,这主要是为了加快检索多个相邻Leaf Node的效率考虑。

在Innodb存储引擎中,存在两种不同形式的索引,一种是Cluster形式的主键索引(PrimaryKey),另外一种则是和其他存储引擎(如MyISAM存储引擎)存放形式基本相同的普通B-Tree索引,这种索引在Innodb存储引擎中被称为Secondary Index。

在Primary Key中,Leaf Nodes存放的是表的实际数据,不仅仅包括主键字段的数据,还包括其他字段的数据,整个数据以主键值有序的排列。而Secondary Index则和其他普通的B-Tree索引没有太大的差异,只是在Leaf Nodes除了存放索引键的相关信息外,还存放了Innodb的主键值。

所以,在Innodb中如果通过主键来访问数据效率是非常高的,而如果是通过Secondary Index来访问数据的话,Innodb首先通过Secondary Index的相关信息,通过相应的索引键检索到Leaf Node之后,需要再通过Leaf Node中存放的主键值再通过主键索引来获取相应的数据行。

小结:普通的B-Tree索引,是从索引找到PK,PK找到这条记录

二、Hash索引
Hash索引在MySQL中使用的并不是很多,目前主要是Memory存储引擎使用,而且在Memory存储引擎中将Hash索引作为默认的索引类型。所谓Hash索引,实际上就是通过一定的Hash算法,将需要索引的键值进行Hash运算,然后将得到的Hash值存入一个Hash表中。然后每次需要检索的时候,都会将检索条件进行相同算法的Hash运算,然后再和Hash表中的Hash值进行比较并得出相应的信息。

Hash索引本身由于其实的特殊性也带来了很多限制和弊端:
1、Hash索引仅仅只能满足“=”,“IN”和“<=>”查询,不能使用范围查询;
2、Hash索引无法被利用来避免数据的排序操作;
3、Hash索引不能利用部分索引键查询;
4、Hash索引在任何时候都不能避免表扫面;
5、Hash索引遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高;

三、Full-text索引
Full-text索引也就是我们常说的全文索引,目前在MySQL中仅有MyISAM存储引擎支持,而且也并不是所有的数据类型都支持全文索引。目前来说,仅有CHAR,VARCHAR和TEXT这三种数据类型的列可以建Full-text索引。

四、R-Tree索引
R-Tree索引可能是我们在其他数据库中很少见到的一种索引类型,主要用来解决空间数据检索的问题。