从数据结构角度
1、B+树索引:关于B+树索引,可以参考 MySQL索引背后的数据结构及算法原理
2、hash索引:
a. 仅仅能满足"=","IN"和"<=>"查询,不能使用范围查询
b. 其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引
c. 只有Memory存储引擎显示支持hash索引。InnoDB引擎不支持hash索引,但是在内存结构中有一个自适应hash索引,来提高查询性能,可以加上--innodb-adaptive-hash-index来开启InnoDB 自适应索引的特性;Navicat中创建表时如果选择hash索引会被自动转成btree索引
3、FULLTEXT索引:主要用来查找文本中的关键字,而不是直接与索引中的值相比较。Full-text索引跟其它索引大不相同,它更像是一个搜索引擎,而不是简单的WHERE语句的参数匹配。你可以对某列分别进行full-text索引和B-Tree索引,两者互不冲突。Full-text索引配合MATCH AGAINST操作使用,而不是一般的WHERE语句加LIKE
4、R-Tree索引: 用于对GIS数据类型创建SPATIAL索引
从物理存储角度
1、聚集索引(clustered index)
B+树本身就是一个索引。它有两个特点:
a. 使用记录主键值的大小进行记录和页的排序,这包括三个方面的含义:
1. 页内的记录是按照主键的大小顺序排成一个单向链表。
2. 各个存放用户记录的页也是根据页中用户记录的主键大小顺序排成一个双向链表。
3. 存放目录项记录的页分为不同的层次,在同一层次中的页也是根据页中目录项记录的主键大小顺序排成一个双向链表
b. B+树的叶子节点存储的是完整的用户记录
我们把具有这两种特性的B+树称为聚簇索引,所有完整的用户记录都存放在这个聚簇索引的叶子节点处
2、非聚集索引(也叫二级索引,non-clustered index)
上边介绍的聚簇索引只能在搜索条件是主键值时才能发挥作用,因为B+树中的数据都是按照主键进行排序的。那如果我们想以别的列作为搜索条件该咋办呢?
我们可以多建几棵B+树,不同的B+树中的数据采用不同的排序规则
比方说我们用c2列的大小作为数据页、页中记录的排序规则,再建一棵B+树
这个B+树与上边介绍的聚簇索引有几处不同:
1. 使用记录c2列的大小进行记录和页的排序
2. B+树的叶子节点存储的并不是完整的用户记录,而只是c2列+主键这两个列的值
3. 目录项记录中不再是主键+页号的搭配,而变成了c2列+页号的搭配
所以如果我们现在想通过c2列的值查找某些记录的话就可以使用我们刚刚建好的这个B+树了。以查找c2列的值为4的记录为例,查找过程如下:
确定目录项记录页
通过目录项记录页确定用户记录真实所在的页
在真实存储用户记录的页中定位到具体的记录
但是这个B+树的叶子节点中的记录只存储了c2和c1(也就是主键)两个列,所以我们必须再根据主键值去聚簇索引中再查找一遍完整的用户记录!
根据这个以c2列大小排序的B+树只能确定我们要查找记录的主键值,所以如果我们想根据c2列的值查找到完整的用户记录的话,仍然需要到聚簇索引中再查一遍,这个过程也被称为回表
因为这种按照非主键列建立的B+树需要一次回表操作才可以定位到完整的用户记录,所以这种B+树也被称为二级索引,或者辅助索引
从逻辑角度
1、主键索引:主键索引是一种特殊的唯一索引,不允许有空值
2、普通索引或者单列索引
3、多列索引(复合索引):复合索引指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用复合索引时遵循最左前缀原则
4、唯一索引或者非唯一索引
5、空间索引:空间索引是对空间数据类型的字段建立的索引,MYSQL中的空间数据类型有4种,分别是GEOMETRY、POINT、LINESTRING、POLYGON。