MySQL 索引是数据库中用于加速数据查询的一种数据结构。它类似于书籍的目录,通过预先建立特定列(或列组合)的索引,数据库可以快速定位到数据的位置,避免全表扫描,从而显著提升查询性能。
1. 索引的类型
1.1 按数据结构分类
-
B-Tree 索引(默认索引类型):
-
适用于等值查询(
=
)和范围查询(>
,<
,BETWEEN
)。 -
支持字符串前缀索引(如
INDEX (name(10))
)。 -
适用场景:大多数常规查询(如主键查询、普通字段查询)。
-
-
哈希索引(Memory 引擎支持):
-
仅支持等值查询(
=
),不支持范围查询。 -
查询速度极快(时间复杂度接近 O(1))。
-
适用场景:内存表(MEMORY 引擎)的快速等值查询。
-
-
全文索引(FULLTEXT):
-
用于文本字段的全文搜索(如
MATCH ... AGAINST
)。 -
支持自然语言和布尔模式搜索。
-
适用场景:大文本字段的模糊匹配(如文章内容搜索)。
-
-
空间索引(R-Tree):
-
用于地理空间数据类型(如
GEOMETRY
,POINT
)。 -
支持空间关系查询(如
ST_Contains
,ST_Distance
)。
-
1.2 按逻辑功能分类
-
主键索引(PRIMARY KEY):
-
唯一且非空的索引,每个表只能有一个主键。
-
默认按主键聚簇存储数据(InnoDB 引擎)。
-
-
唯一索引(UNIQUE):
-
确保列值的唯一性(允许 NULL 值)。
-
可用于避免重复数据。
-
-
普通索引(INDEX 或 KEY):
- 无唯一性约束,仅用于加速查询。
-
组合索引(多列索引):
-
基于多个列的联合索引(如
INDEX (col1, col2)
)。 -
遵循最左前缀原则(查询需包含索引最左列)。
-
2. 索引的创建与删除
2.1 创建索引
-- 单列普通索引
CREATE INDEX idx_name ON table_name (column_name);
-- 唯一索引
CREATE UNIQUE INDEX idx_unique_email ON users (email);
-- 组合索引
CREATE INDEX idx_name_age ON users (name, age);
-- 全文索引(仅适用于 TEXT 类型字段)
CREATE FULLTEXT INDEX idx_content ON articles (content);
2.2 删除索引
DROP INDEX idx_name ON table_name;
3. 索引的优缺点
优点
-
加速查询 :显著减少
SELECT
操作的执行时间。 -
优化排序和分组 :索引可加速
ORDER BY
和GROUP BY
。 -
唯一性约束:唯一索引确保数据唯一性。
缺点
-
占用存储空间:索引需要额外的磁盘空间。
-
降低写操作速度 :
INSERT
/UPDATE
/DELETE
需维护索引。 -
索引失效风险:不合理的索引设计可能导致索引未命中(如未遵循最左前缀原则)。
4. 索引的最佳实践
选择合适的列:
-
频繁作为查询条件的列(如
WHERE
子句中的列)。 -
参与连接(
JOIN
)或排序(ORDER BY
)的列。
避免过多索引:
- 每个索引都会增加写操作的开销,需权衡读写比例。
使用组合索引:
-
优先覆盖高频查询的多个条件。
-
示例:
INDEX (a, b)
可加速WHERE a=1 AND b=2
,但无法加速WHERE b=2
。
注意前缀索引:
- 对长字符串字段(如 VARCHAR(255))使用前缀索引(如
INDEX (name(10))
)。
监控索引使用情况:
-- 查看索引使用统计
SELECT * FROM sys.schema_index_statistics;
-
核心作用:索引是提升查询性能的核心工具,但需合理设计。
-
平衡策略:在查询速度和写操作开销之间找到平衡。
-
分析工具 :使用
EXPLAIN
分析查询执行计划: