新手应先聚焦单条件等值查询、分页列表(带排序)、关联查询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 验证动作:
本书是全面讲述PHP与MySQL的经典之作,书中不但全面介绍了两种技术的核心特性,还讲解了如何高效地结合这两种技术构建健壮的数据驱动的应用程序。本书涵盖了两种技术新版本中出现的最新特性,书中大量实际的示例和深入的分析均来自于作者在这方面多年的专业经验,可用于解决开发者在实际中所面临的各种挑战。 本书内容全面深入,适合各层次PHP和MySQL开发人员阅读,既是优秀的学习教程,也可用作参考手册。
-
单条件等值查询:比如
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,比背十种索引类型管用得多。









