![](http://img.qdhgrc.com/d915e732f782f7c30af46ce28f7b47c3) # 从数据结构角度 ## 1、B+树索引(O(log(n))) 关于B+树索引,可以参考 MySQL索引背后的数据结构及算法原理 ## 2、hash索引 a 仅仅能满足"=","IN"和"<=>"查询,不能使用范围查询 b 其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引 c 只有Memory存储引擎显示支持hash索引 ## 3、FULLTEXT索引 现在MyISAM和InnoDB引擎都支持了 ## 4、R-Tree索引 用于对GIS数据类型创建SPATIAL索引 # 从物理存储角度 ## 1、聚集索引(clustered index) ## 2、非聚集索引(non-clustered index) # 从逻辑角度 ## 1、主键索引 主键索引是一种特殊的唯一索引,不允许有空值 ## 2、普通索引(单列索引) 当存在多个单列索引可以用时,mysql会根据查询优化策略选择其中一个单列索引,并不是每个单列索引都生效。 当同时存在单列索引和联合索引,mysql会根据查询优化策略选择其中一个索引。 如果where中的关系是or,索引不生效。 ## 3、多列索引(复合索引) 复合索引指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用复合索引时遵循最左前缀集合 ## 4、唯一索引或者非唯一索引 唯一索引是这样一种索引,它通过确保表中没有两个数据行具有完全相同的键值来帮助维护数据完整性。 为包含数据的现有表创建唯一索引时,会检查组成索引键的列或表达式中的值是否唯一。如果该表包含具有重复键值的行,那么索引创建过程会失败。为表定义了唯一索引之后,每当在该索引内添加或更改键时就会强制执行唯一性。此强制执行包括插入、更新、装入、导入和设置完整性以命名一些键。除了强制数据值的唯一性以外,唯一索引还可用来提高查询处理期间检索数据的性能。 非唯一索引不用于对与它们关联的表强制执行约束。相反,非唯一索引通过维护频繁使用的数据值的排序顺序,仅仅用于提高查询性能。 ## 5、空间索引 空间索引是对空间数据类型的字段建立的索引,MYSQL中的空间数据类型有4种,分别是GEOMETRY、POINT、LINESTRING、POLYGON。MYSQL使用SPATIAL关键字进行扩展,使得能够用于创建正规索引类型的语法创建空间索引。创建空间索引的列,必须将其声明为NOT NULL,空间索引只能在存储引擎为MYISAM的表中创建