如何通过小表驱动大表及索引优化MySQL JOIN查询效率?

2026-05-07 15:520阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1110个文字,预计阅读时间需要5分钟。

如何通过小表驱动大表及索引优化MySQL JOIN查询效率?

优化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 子句里是“被查”的那一方(即内层循环),它的关联字段就必须有索引。主键、唯一索引、普通索引都行,但不能没有。

阅读全文
标签:Mysql

本文共计1110个文字,预计阅读时间需要5分钟。

如何通过小表驱动大表及索引优化MySQL JOIN查询效率?

优化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 子句里是“被查”的那一方(即内层循环),它的关联字段就必须有索引。主键、唯一索引、普通索引都行,但不能没有。

阅读全文
标签:Mysql