关联字段加索引必须确保每张被驱动表的ON字段独立有索引、类型一致、顺序合理;多字段ON需按顺序建联合索引,JOIN字段须在WHERE字段前,否则易退化为全表扫描。

关联字段加索引不是“加一个就行”,而是要确保每张表在 ON 子句中作为被查找方的字段都独立有索引,且类型一致、顺序合理。否则 MySQL 很可能退化为嵌套循环全表扫描,性能断崖式下跌。
所有 ON 字段必须单独建索引或进联合索引最左位
例如 JOIN users u ON o.user_id = u.id:
-
orders.user_id是被驱动表字段 → 必须有索引(主键、唯一索引或普通索引均可) -
users.id是被驱动表字段 → 同样必须有索引(通常为主键,但不能默认“它肯定有”,要确认) - 如果 ON 条件含多个字段,如
ON t1.a = t2.x AND t1.b = t2.y,则t2上需建INDEX(x, y),顺序必须与 ON 中一致 -
INDEX(a, b, c)无法加速ON t2.b = ?—— 因为b不是最左前缀
LEFT JOIN 的右表字段最容易漏建索引
很多人只给左表(驱动表)加了 WHERE 条件索引,却忘了右表的 ON 字段也要索引:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- LEFT JOIN 中,右表是被驱动方,每行左表记录都会触发对右表的匹配查找
- 若右表无索引,10 万行左表 × 右表 100 万行 = 1000 亿次扫描
- EXPLAIN 显示右表
type = ALL就是典型信号,务必检查右表 ON 字段是否已建索引
联合索引顺序:JOIN 字段必须在 WHERE 字段之前
MySQL 执行逻辑是:先用 ON 条件定位匹配行,再对匹配结果做 WHERE 过滤。所以索引必须优先支持 ON 查找:
- 错误写法:
INDEX(status, id)→ON u.id = o.user_id用不上 - 正确写法:
INDEX(id, status)→ 先按id快速定位,再过滤status - 若 WHERE 条件区分度极高(如唯一 ID),而 JOIN 字段低区分度(如 category_id),可考虑子查询先过滤再 JOIN,而非强求单索引兼顾
别忽略字段类型和隐式转换
索引建了也白建,如果字段类型不一致:
-
INT对UNSIGNED INT、VARCHAR(50)对VARCHAR(100)、字符串对数字 - MySQL 会触发隐式类型转换,导致被驱动表索引完全失效
- 用
SHOW CREATE TABLE核对两边字段定义,确保完全一致

















