MySQL 的索引类型可以从多个维度进行分类,以下是常见的索引类型及其特点、适用场景和创建方式的总结:
一、按数据结构分类
- B-Tree 索引(默认索引类型)
- 特点:
- 基于平衡多路搜索树(B+树)实现,支持等值查询(
=
)、范围查询(>
,<
,BETWEEN
)、排序(ORDER BY
)、分组(GROUP BY
)等。 - 叶子节点存储数据或主键值(InnoDB 的聚簇索引直接存储数据,非聚簇索引存储主键值)。
- 支持前缀匹配(如
LIKE 'abc%'
),但LIKE '%abc'
无法利用索引。
- 基于平衡多路搜索树(B+树)实现,支持等值查询(
- 适用场景:
- 全值匹配、范围查询、排序、分组。
- 创建示例:
CREATE INDEX idx_name ON users(name); -- 单列索引 CREATE INDEX idx_name_age ON users(name, age); -- 组合索引
- 特点:
- Hash 索引
- 特点:
- 基于哈希表实现,仅支持等值查询(
=
、IN
),不支持范围查询或排序。 - 查询效率高(时间复杂度为
O(1)
),但存在哈希冲突问题。 - 仅适用于内存表(
MEMORY
引擎)或InnoDB
的自适应哈希索引(自动创建)。
- 基于哈希表实现,仅支持等值查询(
- 适用场景:
- 等值查询(如缓存场景)。
- 创建示例:
CREATE TABLE hash_table (id INT, name VARCHAR(100)) ENGINE = MEMORY; -- MEMORY 引擎支持显式 Hash 索引
- 特点:
- Full-Text 索引(全文索引)
- 特点:
- 使用倒排索引技术,支持对
CHAR
、VARCHAR
、TEXT
列进行全文检索。 - 仅适用于
MyISAM
和InnoDB
(MySQL 5.6+)。 - 支持自然语言搜索(
MATCH ... AGAINST
)、布尔模式搜索等。
- 使用倒排索引技术,支持对
- 适用场景:
- 文本内容搜索(如博客文章、商品描述)。
- 创建示例:
CREATE FULLTEXT INDEX idx_content ON articles(content);
- 特点:
- R-Tree 索引(空间索引)
- 特点:
- 专为多维空间数据(如地理坐标)设计,支持范围查询和空间关系查询。
- 仅支持
GEOMETRY
数据类型,适用于MyISAM
、InnoDB
等存储引擎。
- 适用场景:
- 地理位置数据查询(如最近距离、区域查询)。
- 创建示例:
CREATE TABLE locations (id INT, coord GEOMETRY) ENGINE = MyISAM; CREATE INDEX idx_coord ON locations(coord) USING RTree;
- 特点:
二、按索引性质分类
- 主键索引(Primary Key Index)
- 特点:
- 一种特殊的唯一索引,不允许空值(
NOT NULL
),一个表只能有一个主键。 - 在
InnoDB
中,主键索引是聚簇索引(数据行与索引存储在一起)。
- 一种特殊的唯一索引,不允许空值(
- 创建示例:
CREATE TABLE users ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(32) );
- 特点:
- 唯一索引(Unique Index)
- 特点:
- 索引列的值必须唯一,允许空值(但
NULL
可以有多个)。 - 用于防止重复数据插入。
- 索引列的值必须唯一,允许空值(但
- 创建示例:
CREATE UNIQUE INDEX idx_email ON users(email);
- 特点:
- 普通索引(Normal Index)
- 特点:
- 最基本的索引类型,没有任何限制。
- 用于加速查询,但不保证值的唯一性。
- 创建示例:
CREATE INDEX idx_name ON users(name);
- 特点:
- 联合索引(Composite Index / 组合索引)
- 特点:
- 多个字段组成的索引,遵循最左前缀原则。
- 适用于多列查询条件,提升联合查询性能。
- 创建示例:
CREATE INDEX idx_name_age ON users(name, age);
- 特点:
- 全文索引(Full-Text Index)
- 特点:
- 已在“按数据结构分类”中详细说明。
- 创建示例:
CREATE FULLTEXT INDEX idx_content ON articles(content);
- 特点:
- 空间索引(Spatial Index)
- 特点:
- 已在“按数据结构分类”中详细说明。
- 创建示例:
CREATE INDEX idx_coord ON locations(coord) USING RTree;
- 特点:
三、InnoDB 引擎的聚簇索引与非聚簇索引
- 聚簇索引(Clustered Index)
- 特点:
- 数据行的物理存储顺序与索引的逻辑顺序一致。
- 主键索引默认是聚簇索引,叶子节点存储完整数据行。
- 适用场景:
- 主键查询、范围查询、高频查询字段为索引列。
- 特点:
- 非聚簇索引(Secondary Index / 辅助索引)
- 特点:
- 叶子节点存储主键值(需回表查询完整数据)。
- 一个表可以有多个非聚簇索引。
- 适用场景:
- 非主键字段查询,需通过主键回表获取数据。
- 特点:
四、索引选择建议
查询类型 | 推荐索引类型 |
---|---|
等值查询 | Hash 索引(Memory 引擎) |
范围查询、排序 | B-Tree 索引 |
全文搜索 | Full-Text 索引 |
地理空间查询 | R-Tree 索引 |
多列联合查询 | 联合索引(最左前缀原则) |
五、注意事项
- 索引维护成本:
- 插入、更新、删除操作会增加索引维护开销,需权衡查询性能与写入性能。
- 覆盖索引:
- 查询字段全部命中索引时(如联合索引),无需回表,性能更高。
- 存储引擎差异:
MyISAM
不支持全文索引(MySQL 5.6+ InnoDB 支持)。Hash
索引仅在MEMORY
引擎中显式支持。
通过合理选择索引类型并结合业务需求,可以显著提升 MySQL 的查询性能。
THE END