MySQL中的索引类型
从数据结构角度
B+树索引:
O(log(n))
相对HASH索引,BTREE在查找单条记录的速度虽然比不上HASH索引,但是更适合排序等操作,而且大部分都是范围查找的查询操作。
hash索引:
仅仅能满足"=","IN"和"<=>"查询,不能使用范围查询
检索效率高,可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引
只有Memory存储引擎显示支持hash索引
FULLTEXT索引(现在MyISAM和InnoDB引擎都支持了)
R-Tree索引(用于对GIS数据类型创建SPATIAL索引)
从物理存储角度
聚集索引(clustered index)
按每张表的主键构造一颗B+树,并且叶节点存放行记录数据。每张表只能有一个聚集索引(一个主键)
对于主键的排序查找和范围的速度非常快:叶节点的数据就是我们要找的数据。
非聚集索引(non-clustered index)
辅助索引,也称非聚集索引,叶节点不包含行的全部数据
辅助索引的存在并不影响数据在聚集索引中的组织,因此一个表可以有多个辅助索引。
通过辅助索引查找数据时,innodb会遍历辅助索引并通过叶节点的指针获得指向主键索引的主键。然后再通过主键索引找到一行完整的数据。
从逻辑角度
主键索引:主键索引是一种特殊的唯一索引,不允许有空值
普通索引或者单列索引
多列索引(复合索引):在多个字段上创建的索引,遵循最左前缀集合:只有在查询条件中使用创建索引时的第一个字段,索引才会被使用。
唯一索引或者非唯一索引
空间索引:空间索引是对空间数据类型的字段建立的索引,MYSQL中的空间数据类型有4种,分别是GEOMETRY、POINT、LINESTRING、POLYGON。
从查询角度
覆盖索引
覆盖索引只是一种查询的效果,指一个查询语句的执行只需要从辅助索引中就可以得到查询记录,而不需要查询聚集索引中的记录,也称为实现了索引覆盖。
如果EXPLAIN中的Extra中出现Using index,则表示该SQL实现了覆盖索引;
扩展阅读
Last updated