索引可以理解为帮助数据库快速定位数据的“目录”。如果没有索引,MySQL 在查询某些数据时可能需要从头到尾扫描整张表;有了合适的索引后,就可以更快定位目标记录。
索引的核心作用是提高查询效率,尤其是在以下场景中效果明显:
WHERE条件筛选JOIN关联查询ORDER BY排序GROUP BY分组
索引的典型特点有:
- 能显著提高查询速度。
- 会占用额外存储空间。
- 会增加插入、更新、删除时的维护成本。
也就是说,索引不是越多越好,而是应该根据查询场景来建立。
MySQL 中常见索引包括:
- 主键索引(
PRIMARY KEY) - 唯一索引(
UNIQUE) - 普通索引(
INDEX) - 全文索引(
FULLTEXT) - 组合索引(多个字段共同组成)
例如:
- 主键索引用于唯一标识记录
- 唯一索引用于保证某列值不重复
- 普通索引用于加速一般查询
- 全文索引用于文本检索
- 组合索引用于多个字段联合查询
设计索引时通常遵循以下原则:
- 优先为高频查询字段建立索引。
- 常出现在
WHERE、JOIN、ORDER BY中的字段更值得建索引。 - 区分度高的字段更适合建立索引。
- 不要给很少查询、频繁更新的字段随意加索引。
- 能用组合索引解决问题时,不一定要拆成多个单列索引。
例如下面这类查询:
SELECT *
FROM mytable
WHERE city = '上海' AND age = 20;如果这类查询非常频繁,就可以考虑给 city、age,或者 (city, age) 建立索引。
索引的本质是用空间换时间。它能明显提升查询性能,但也会增加写入成本。是否建索引,关键不在于“能不能建”,而在于“值不值得建”。