Skip to content

JOIN 优化

1、如何区分驱动表和被驱动表?

使用 explain 判断,id 相同时先执行的就是驱动表。驱动表决定数据量,被驱动表决定查询效率。一般情况下,先执行的是驱动表,在 JOIN 执行的过程中,驱动表的每一行都会去匹配被驱动表,被驱动表会为驱动表的每一行进行查询匹配。

2、如何优化驱动表和被驱动表?

  • 驱动表通常是全表扫描或范围扫描,而且每行都会去匹配被驱动表,决定查询的循环次数,因此优化的方式是想办法减少驱动表的数据量(小表),或者使用过滤条件多的表作为驱动表
  • 被驱动表会为驱动表的每一行进行匹配查找,因此优化的方式是使用有索引的表作为被驱动表,或者在被驱动表上创建索引,来提高查找效率

优化原则:

  • 小表驱动大表(减少循环次数)
  • 有索引的表作为被驱动表(提高查找效率)
  • 过滤条件多的表作为驱动表(先过滤减少数据量)

3、驱动表和被驱动表都有可能是 eq_ref 吗?

  • 驱动表:通常不会是 eq_ref,因为驱动表通常是全表扫描、范围扫描或索引扫描
  • 被驱动表:当使用唯一索引进行等值连接时,就是 eq_ref。在典型的 JOIN 查询中,只有被驱动表会显示为 eq_ref,表示它通过唯一索引进行精确匹配