1. 索引失效的常见场景
即使创建了索引,某些情况下索引可能无法生效,导致查询性能下降。以下是常见失效场景:
1.1 不符合最左前缀原则
- 组合索引必须从最左列开始使用。
示例:索引为(a, b, c)
- ✅ 有效:
WHERE a=1 AND b=2
- ✅ 有效:
WHERE a=1 ORDER BY b
- ❌ 无效:
WHERE b=2
(未使用最左列a
)
1.2 对索引列使用函数或计算
1.3 使用LIKE
左模糊匹配
1.4 隐式类型转换
1.5 使用OR
连接非索引列
2. 索引优化技巧
2.1 覆盖索引(Covering Index)
2.2 索引下推(Index Condition Pushdown, ICP)
2.3 前缀索引(Prefix Index)
3. 执行计划分析(EXPLAIN)
使用EXPLAIN
命令分析查询是否命中索引,优化执行效率。
3.1 关键字段解读
字段 | 说明 |
---|
type | 访问类型(性能从优到差:const > eq_ref > ref > range > index > ALL ) |
key | 实际使用的索引 |
rows | 预估需要扫描的行数 |
Extra | 额外信息(如Using index 表示覆盖索引,Using filesort 表示需要排序) |
3.2 示例分析
EXPLAIN SELECT * FROM users WHERE name = 'Alice' AND age = 25;
- 如果
key
显示idx_name_age
且type
为ref
,说明索引生效。 - 如果
Extra
显示Using where
,表示存储引擎层过滤后仍需服务层进一步处理。
4. 索引与存储引擎
4.1 InnoDB 索引特点
- 聚簇索引:数据按主键顺序存储,主键索引的叶子节点直接包含行数据。
- 二级索引:叶子节点存储主键值,查询时需要回表(除非覆盖索引)。
4.2 MyISAM 索引特点
- 非聚簇索引:索引和数据分离,索引叶子节点存储数据行地址。
- 全文索引:支持
FULLTEXT
索引,适合文本搜索。
4.3 InnoDB vs MyISAM 索引对比
特性 | InnoDB | MyISAM |
---|
索引类型 | 聚簇索引 + 二级索引 | 非聚簇索引 |
事务支持 | ✅ | ❌ |
行级锁 | ✅ | 表级锁 |
全文索引 | ✅(MySQL 5.6+) | ✅ |
5. 索引设计的最佳实践
- 优先使用组合索引:覆盖多个查询条件,减少索引数量。
- 避免冗余索引:如已有
(a, b)
,再创建(a)
是冗余的。 - 定期分析慢查询:使用
slow_query_log
定位需要优化的查询。 - 监控索引使用率:通过
INFORMATION_SCHEMA.STATISTICS
表分析未使用的索引。
6. 索引的常见误区
误区 | 解释 |
---|
索引越多越好 | 过多索引会增加写开销和存储成本。 |
所有查询都能用索引加速 | 索引只对特定查询模式有效(如等值、范围查询)。 |
主键必须是自增ID | 主键可以是任何唯一且非空的字段,但自增ID对插入性能更友好。 |