如何通过小表驱动大表及索引优化MySQL JOIN查询效率?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1110个文字,预计阅读时间需要5分钟。
优化MySQL的JOIN性能,关键不在于让大表变小,而是让优化器选择合适的驱动表,并确保每次内层匹配都走索引。否则,即使只驱动10行,无索引的驱动表也可能扫描10×100万行。
怎么看哪张表实际当了驱动表
别看建表语句或 EXPLAIN 输出里表的顺序,要看 EXPLAIN 中每行的 rows 列:它代表该表经过 WHERE 过滤后预估返回的行数。优化器选的驱动表,就是这个值最小的那张表。
-
LEFT JOIN下左表强制驱动,哪怕它的rows是 50 万,也得硬着上; -
INNER JOIN下优化器会估算所有表过滤后的rows,挑最小的当驱动表; - 如果发现
EXPLAIN显示大表被选为驱动表(比如rows达几十万),说明你的WHERE条件没生效,或者统计信息过期,该跑ANALYZE TABLE了; - 用
STRAIGHT_JOIN强制顺序前,先确认你比优化器更懂数据分布——否则可能把 100 行驱动变成 10 万行驱动。
被驱动表的 ON 字段必须单独建索引
只要某张表在 ON 子句里是“被查”的那一方(即内层循环),它的关联字段就必须有索引。主键、唯一索引、普通索引都行,但不能没有。
本文共计1110个文字,预计阅读时间需要5分钟。
优化MySQL的JOIN性能,关键不在于让大表变小,而是让优化器选择合适的驱动表,并确保每次内层匹配都走索引。否则,即使只驱动10行,无索引的驱动表也可能扫描10×100万行。
怎么看哪张表实际当了驱动表
别看建表语句或 EXPLAIN 输出里表的顺序,要看 EXPLAIN 中每行的 rows 列:它代表该表经过 WHERE 过滤后预估返回的行数。优化器选的驱动表,就是这个值最小的那张表。
-
LEFT JOIN下左表强制驱动,哪怕它的rows是 50 万,也得硬着上; -
INNER JOIN下优化器会估算所有表过滤后的rows,挑最小的当驱动表; - 如果发现
EXPLAIN显示大表被选为驱动表(比如rows达几十万),说明你的WHERE条件没生效,或者统计信息过期,该跑ANALYZE TABLE了; - 用
STRAIGHT_JOIN强制顺序前,先确认你比优化器更懂数据分布——否则可能把 100 行驱动变成 10 万行驱动。
被驱动表的 ON 字段必须单独建索引
只要某张表在 ON 子句里是“被查”的那一方(即内层循环),它的关联字段就必须有索引。主键、唯一索引、普通索引都行,但不能没有。

