适合新手,但必须从“查得慢”这个具体问题出发,而不是一上来就背索引类型。
为什么新手容易在索引上卡住
不是因为概念难,而是因为 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,比背十种索引类型管用得多。
