索引是帮助MySQL高效获取数据的数据结构。就像书本的目录一样,可以快速定位到需要查找的内容。以下是MySQL中索引的主要分类和详解。
一、按数据结构划分
这是最核心的分类方式,决定了索引的底层实现和适用场景。
- B+Tree索引
- 描述:这是MySQL中最常用、最主流的索引类型。
InnoDB和MyISAM存储引擎都支持B+Tree索引。 - 特点:
- 有序性:数据存储在叶子节点上,并且叶子节点之间通过指针相连,形成一个有序链表,非常适合范围查询(如
WHERE id > 10)。 - 矮胖平衡树:树的高度低,意味着通常只需要很少的磁盘I/O就能找到目标数据。
- 有序性:数据存储在叶子节点上,并且叶子节点之间通过指针相连,形成一个有序链表,非常适合范围查询(如
- 适用场景:几乎适用于所有需要索引的场景,特别是主键索引和范围查询。
- 描述:这是MySQL中最常用、最主流的索引类型。
- 哈希索引
- 描述:基于哈希表实现,只有精确匹配所有列的查询才有效。
Memory存储引擎默认支持哈希索引。InnoDB也支持自适应哈希索引,但这是数据库内部自动管理的。 - 特点:
- 查询极快:对于等值查询(
=),速度通常比B+Tree索引更快。 - 无序:不支持范围查询和排序。
- 不支持最左前缀匹配原则。
- 查询极快:对于等值查询(
- 适用场景:只适用于等值查询,且数据重复度低的列。
- 描述:基于哈希表实现,只有精确匹配所有列的查询才有效。
- 全文索引
- 描述:用于查找文本中的关键词,类似于搜索引擎。它解决的是
LIKE '%keyword%'查询效率低下的问题。 - 特点:
- 适用于
CHAR、VARCHAR和TEXT类型的列。 - 有自己的一套分词和匹配规则。
- 适用于
- 适用场景:在大量的文本数据中搜索关键词。
- 描述:用于查找文本中的关键词,类似于搜索引擎。它解决的是
- R-Tree索引(空间索引)
- 描述:主要用于地理空间数据类型,如
GEOMETRY。 - 特点:支持对空间数据进行高效查询,例如“查找附近的所有地点”。
- 适用场景:地理信息系统(GIS)。
- 描述:主要用于地理空间数据类型,如
二、按物理存储划分(聚集 vs 非聚集)
这个分类主要针对B+Tree索引,描述了数据行和索引的存储关系。
- 聚集索引
- 描述:表数据本身(数据行)就按照索引的键值顺序存储在叶子节点上。一张表只能有一个聚集索引。
- 在InnoDB中:
- 如果定义了主键,主键就是聚集索引。
- 如果没有主键,则选择第一个
UNIQUE且非空的列作为聚集索引。 - 如果都没有,InnoDB会隐式创建一个隐藏的列作为聚集索引。
- 优点:因为数据行直接存储在索引中,所以通过主键查询非常高效。
- 非聚集索引(二级索引/辅助索引)
- 描述:索引的叶子节点不包含完整的数据行,而是存储了指向数据行的指针(在InnoDB中,这个指针是主键的值)。一张表可以有多个非聚集索引。
- 查询过程:当通过非聚集索引查询时,需要先找到对应的主键值,然后再回到聚集索引(主键索引)中去查找完整的数据行,这个过程称为回表。
三、按逻辑功能/字段特性划分
这个分类是根据索引作用的字段的特性和约束来划分的。
- 主键索引
- 一种特殊的唯一索引,不允许有空值。每个表只能有一个主键索引。在InnoDB中,它就是聚集索引。
- 唯一索引
- 索引列的值必须唯一,但允许有空值(
NULL)。一张表可以有多个唯一索引。
- 索引列的值必须唯一,但允许有空值(
- 普通索引
- 最基本的索引类型,没有任何唯一性限制,仅仅是为了提高查询速度。
- 前缀索引
- 当索引的列是字符串时,可以只对列的前
n个字符建立索引,以节省空间。例如:INDEX (column_name(n))。
- 当索引的列是字符串时,可以只对列的前
- 复合索引(联合索引)
- 一个索引包含多个列。查询时遵循最左前缀匹配原则,即从索引的最左边列开始匹配。例如,索引是
(A, B, C),那么查询条件包含A、A,B或A,B,C时索引才会生效。
- 一个索引包含多个列。查询时遵循最左前缀匹配原则,即从索引的最左边列开始匹配。例如,索引是