Mysql有哪些索引
按数据结构划分
这决定了索引的底层实现方式和它的适用场景。
-
B+Tree索引: 这是最常见、也是默认的索引类型,InnoDB和MyISAM都使用它。它的数据结构是一个平衡的多路搜索树,所有数据都按顺序存储。
- 优点:非常适合用于全键值、键值范围或最左前缀的查找。对
=,>,<,BETWEEN,IN以及以常量开头的LIKE查询效率都很高。 - 适用场景:绝大多数的查询场景。
- 优点:非常适合用于全键值、键值范围或最左前缀的查找。对
-
哈希索引: 这是Memory存储引擎的默认索引类型。它基于哈希表实现,只有精确匹配索引所有列的查询才有效。
- 优点:对于等值查询(
=和IN),它的速度极快,时间复杂度是O(1)。 - 缺点:不支持范围查询和排序。因为数据不是有序存储的,所以
ORDER BY操作也无法利用哈希索引。 - 补充:InnoDB有一个“自适应哈希索引”(Adaptive Hash Index)的功能,它会在B-Tree索引的基础上,对热点数据自动构建哈希索引,以提升查询性能。
- 优点:对于等值查询(
-
全文索引 (Full-text Index): 这是一种特殊的索引,主要用于在大量文本中进行关键词搜索。
- 工作原理:它通过建立一个“倒排索引”来实现,记录了每个词在哪些文档中出现。
- 使用方式:配合
MATCH() ... AGAINST()语法使用,而不是LIKE。 - 适用场景:用于文章、评论等文本内容的搜索。
-
空间数据索引 (R-Tree Index): 这是一种比较特殊的索引,主要用于地理空间数据类型(GIS),可以高效地进行空间查询。这个在常规的业务开发中用得比较少。
按逻辑功能划分
这是我们开发者在创建索引时,从业务角度给索引赋予的“角色”。
-
普通索引 (Normal Index): 最基本的索引,没有任何限制。它的唯一作用就是加速查询。
-
唯一索引 (Unique Index): 它在普通索引的基础上,增加了数据唯一性的约束。即索引列的值必须是唯一的,但允许有多个NULL值。
-
主键索引 (Primary Key Index): 这是一种特殊的唯一索引,它不允许有NULL值,并且一张表只能有一个主键索引。它用于唯一地标识表中的每一行记录。在InnoDB中,主键索引有非常特殊的地位。
-
组合索引 (Composite Index): 也叫复合索引。它是指在表的多个列上创建一个索引。
- 遵循“最左前缀原则”:一个组合索引
idx(col1, col2, col3),相当于创建了(col1)、(col1, col2)、(col1, col2, col3)这几个索引的效果。如果查询条件没有使用到索引的最左边的列,比如WHERE col2 = 'x',那么这个索引就无法被使用。
- 遵循“最左前缀原则”:一个组合索引
按物理存储方式划分(InnoDB特有)
这是InnoDB引擎中一个非常重要的概念,它决定了数据和索引是如何组织在一起的。
-
聚簇索引 (Clustered Index):
- 定义:聚簇索引的叶子节点存储的不是索引指针,而是完整的行数据。因此,索引和数据是存放在一起的。
- 特性:一张表只能有一个聚簇索引。InnoDB会按照以下顺序来选择或创建聚簇索引:
- 如果表定义了主键,则主键索引就是聚簇索引。
- 如果没有主键,则会选择第一个非空的唯一索引作为聚簇索引。
- 如果以上都没有,InnoDB会自动生成一个隐藏的6字节的
ROW_ID作为聚簇索引。
- 优点:根据主键进行查询时,速度极快,因为找到索引就找到了数据,不需要额外的回表操作。
-
非聚簇索引 (Non-Clustered Index) 或 辅助索引 (Secondary Index):
- 定义:除了聚簇索引之外的所有索引,都称为非聚簇索引或辅助索引。
- 特性:它的叶子节点存储的不是行数据,而是该行数据对应的主键值。
- 查询过程:当使用辅助索引进行查询时,会先通过该索引找到对应的主键值,然后再用这个主键值去聚簇索引中查找完整的行数据。这个过程被称为“回表”。
- 优化:为了避免回表带来的性能开销,我们可以使用“覆盖索引”。如果一个查询所需的所有数据(
SELECT列表和WHERE条件)都能在一个辅助索引中直接获取,那么就不需要回表了,这种查询方式就叫覆盖索引查询,性能会很高。