数据库慢,绝大多数时候是"没用索引"或"索引没用对"。掌握索引,是后端和运维的必修课。
一、索引是什么
索引就像一本书的目录:不建索引时查数据要逐行扫描(全表扫描);建了索引就能快速定位。MySQL 默认用 B+ 树索引。
二、用 EXPLAIN 看执行计划
EXPLAIN SELECT * FROM users WHERE email='a@b.com';
-- 重点看 type、key、rows 三列
type=ALL表示全表扫描(危险信号)key=NULL表示没走索引rows是预估扫描行数,越少越好
三、建立合适的索引
CREATE INDEX idx_email ON users(email); -- 单列索引
CREATE INDEX idx_city_age ON users(city, age); -- 联合索引
四、最左前缀原则
联合索引 (city, age) 能加速 WHERE city=? 和 WHERE city=? AND age=?,但不能单独加速 WHERE age=?——因为索引按 city 优先排序。
索引不是越多越好:每个索引都会拖慢写入速度、占用存储。只为高频查询条件建索引。
五、常见反例
- 对索引列用函数:
WHERE YEAR(create_time)=2026→ 索引失效 - 用
SELECT *:应只查需要的列 - 前导模糊查询:
LIKE '%abc'无法用索引
六、小结
索引优化是性能调优性价比最高的手段。养成写完 SQL 跑一下 EXPLAIN 的习惯,能避免大部分慢查询。