MySQL 的索引类型丰富多样,不同的索引适用于不同的场景和数据结构。以下是常见的索引类型及其核心特点和应用场景:
1. B-Tree 索引(B+Tree)
-
默认索引类型,适用于大多数场景(InnoDB、MyISAM 均支持)。
-
特点 :
- 按顺序存储数据,支持全值匹配、范围查询(
>
、<
、BETWEEN
)和前缀匹配。 - 基于 B+Tree 结构,叶子节点通过指针连接,适合排序和范围扫描。
- 支持联合索引(最左前缀匹配原则)。
- 按顺序存储数据,支持全值匹配、范围查询(
-
适用场景 :
WHERE
条件中的等值查询、范围查询。ORDER BY
或GROUP BY
的排序优化。
-
示例 :
sqlCREATE INDEX idx_name ON users(name); -- 单列索引 CREATE INDEX idx_name_age ON users(name, age); -- 联合索引
2. 哈希索引(Hash Index)
-
基于哈希表实现 ,仅支持精确匹配(
=
查询)。 -
特点 :
- 查询速度极快(O(1) 时间复杂度)。
- 不支持范围查询、排序或前缀匹配。
- 只有 Memory 存储引擎显式支持哈希索引;InnoDB 支持自适应哈希索引(自动优化)。
-
适用场景 :
- 频繁的等值查询(如缓存表)。
- 内存表(Memory 引擎)的快速查找。
-
示例 :
sqlCREATE TABLE cache_table ( id INT PRIMARY KEY, data VARCHAR(100) ) ENGINE=MEMORY; CREATE INDEX idx_hash USING HASH ON cache_table(id);
3. 全文索引(Full-Text Index)
-
针对文本内容的搜索优化,支持自然语言搜索。
-
特点 :
- 基于倒排索引(Inverted Index),支持关键词匹配和相关性评分。
- 支持
MATCH() AGAINST()
语法,可处理停用词和词干提取(需配置)。 - InnoDB(5.6+)和 MyISAM 均支持。
-
适用场景 :
- 文章、日志等大文本字段的模糊搜索(如
LIKE '%keyword%'
的优化)。 - 实现搜索引擎类功能。
- 文章、日志等大文本字段的模糊搜索(如
-
示例 :
sqlCREATE TABLE articles ( id INT PRIMARY KEY, content TEXT, FULLTEXT(content) ) ENGINE=InnoDB; -- 查询示例 SELECT * FROM articles WHERE MATCH(content) AGAINST('database');
4. 空间索引(R-Tree / SPATIAL Index)
-
用于地理空间数据类型 (如
GEOMETRY
、POINT
、POLYGON
)。 -
特点 :
- 基于 R-Tree 结构,支持空间关系计算(如距离、包含、相交)。
- 仅 MyISAM 和 InnoDB(5.7+)支持。
-
适用场景 :
- 地理信息系统(GIS)应用。
- 地图数据中的位置查询(如"附近的人")。
-
示例 :
sqlCREATE TABLE locations ( id INT PRIMARY KEY, position POINT NOT NULL, SPATIAL INDEX(position) ) ENGINE=MyISAM; -- 查询附近10公里内的点 SELECT * FROM locations WHERE ST_Distance_Sphere(position, POINT(116.39, 39.9)) <= 10000;
5. 前缀索引(Prefix Index)
-
对字段的前 N 个字符建立索引,节省存储空间。
-
特点 :
- 需权衡前缀长度与选择性(避免重复值过多)。
- 适用于长字符串(如
VARCHAR(255)
)。
-
适用场景 :
- 长文本字段的部分索引优化。
- 减少索引占用的磁盘空间。
-
示例 :
sqlCREATE INDEX idx_email_prefix ON users(email(10)); -- 对email前10字符建索引
6. 覆盖索引(Covering Index)
-
索引包含查询所需的所有字段,无需回表查询数据行。
-
特点 :
- 通过
EXPLAIN
的Extra
列显示Using index
。 - 显著减少 I/O 操作,提升查询速度。
- 通过
-
适用场景 :
- 高频查询仅需索引字段的场景。
- 优化聚合查询(如
COUNT(*)
、SUM()
)。
-
示例 :
sql-- 创建联合索引(包含查询所需字段) CREATE INDEX idx_covering ON orders(user_id, status, amount); -- 查询示例(无需回表) SELECT user_id, amount FROM orders WHERE status = 'paid';
7. 唯一索引(Unique Index)
-
强制索引列的值唯一(允许 NULL 值,但最多一个 NULL)。
-
特点 :
- 主键索引(PRIMARY KEY)是特殊的唯一索引(不允许 NULL)。
- 用于数据完整性约束。
-
示例 :
sqlCREATE UNIQUE INDEX idx_unique_email ON users(email);
8. 自适应哈希索引(Adaptive Hash Index)
- InnoDB 自动为热点数据创建的哈希索引,无需手动干预。
- 特点 :
- 对频繁访问的索引页自动生成哈希索引。
- 提升等值查询性能,但对范围查询无效。
总结:如何选择索引类型?
- 通用场景 :优先使用 B-Tree 索引(默认选择)。
- 精确匹配 :高频等值查询可考虑 哈希索引(Memory 引擎)。
- 文本搜索 :使用 全文索引 替代
LIKE
模糊查询。 - 空间数据 :GIS 应用选择 空间索引。
- 长字段优化 :使用 前缀索引 减少存储开销。
- 查询加速 :通过 覆盖索引 避免回表。
通过合理选择索引类型,可以显著提升查询性能并降低资源消耗。