新手应先聚焦单条件等值查询、分页列表(带排序)、关联查询ON条件三类sql,每类用EXPLaiN验证索引是否生效,再结合区分度计算(

适合新手,但必须从“查得慢”这个具体问题出发,而不是一上来就背索引类型。
为什么新手容易在索引上卡住
不是因为概念难,而是因为 mysql 不会直接告诉你“这里该加索引”。它只会默默执行一条 select,耗时 8 秒——而你翻遍表结构,发现所有字段都“看起来合理”。常见卡点包括:
- 看到
WHERE user_id = ?就给user_id加索引,但实际查询还带ORDER BY created_at DESC LIMIT 20,单列索引无效 - 给
status(只有 ‘active’/’inactive’ 两个值)建索引,结果优化器直接弃用,因为选择性太低 - 写了
WHERE name LIKE '%张%',却指望普通 B+ 树索引加速——前导模糊匹配根本用不上索引 - 建了
(a, b, c)复合索引,但查询只用了b = ? AND c = ?,因不满足最左前缀原则,索引完全失效
新手起步最该盯住的三类 SQL
别贪多,先盯死这三类真实高频场景,每类配一个 EXPLAIN 验证动作:
- 单条件等值查询:比如
SELECT * FROM orders WHERE order_no = 'ORD123456'→ 直接在order_no上建UNIQUE INDEX - 分页列表(带排序):比如
SELECT * FROM articles WHERE category_id = 5 ORDER BY publish_time DESC LIMIT 0,20→ 必须建(category_id, publish_time)复合索引,且顺序不能颠倒 - 关联查询的 ON 条件:比如
JOIN users u ON u.id = o.user_id→users.id(主键自动有索引)、orders.user_id必须单独建索引
加索引前必须做的两件事
跳过这两步,90% 的索引是白加,甚至拖慢写入:
- 用
EXPLAIN format=TREE(MySQL 8.0+)或EXPLAIN看type是否为ref/range,key是否显示用了哪个索引,rows是否明显小于表总行数 - 确认该字段的区分度:
SELECT count(DISTINCT column_name)/COUNT(*) FROM table_name;—— 结果低于 0.01(即 1%)就别建了,比如is_deleted、gender
真正卡新手的,从来不是“怎么建索引”,而是“怎么证明它起了作用”。盯着 EXPLAIN 的 rows 和 Extra 里的 using index condition 或 Using filesort,比背十种索引类型管用得多。