当T1有许多T2并且条件保持在T2时,将T2连接到T1而不是T1连接到T2会更有效吗?或者它是一样的?

时间:2011-09-30 04:16:09

标签: mysql performance join

我知道以下查询返回相同的内容:

SELECT `cimgs`.* 
FROM `cimgs`
INNER JOIN `cimgs_tags` ON `cimgs_tags`.`cimg_id` = `cimgs`.`id`
WHERE `cimgs_tags`.`tag_id` IN (1, 2, 3, 4, 5) AND (cimgs.id != 1)

SELECT `cimgs`.*
FROM `cimgs_tags`
INNER JOIN `cimgs` ON `cimgs`.`id` = `cimgs_tags`.`cimg_id`
WHERE `cimgs_tags`.`tag_id` IN (1, 2, 3, 4, 5) AND (cimgs.id != 1)

但是,乍一看我会说第一个在检查条件之前复制每个标签的cimgs表,当第二个检查条件然后它加入相应的表时...... / p>

虽然我不知道MySQL是否会自动检测并优化它,但这两个查询的性能是否相似?

3 个答案:

答案 0 :(得分:3)

查询优化器会为您执行此操作。它将使用索引统计信息,您应该与ANALYSE TABLE保持同步。您可以使用STRAIGHT_JOIN强制执行联接顺序,并且您也可以强制使用某些索引。

你可以解释一下:

EXPLAIN SELECT `cimgs`.* 
FROM `cimgs`
INNER JOIN `cimgs_tags` ON `cimgs_tags`.`cimg_id` = `cimgs`.`id`
WHERE `cimgs_tags`.`tag_id` IN (1, 2, 3, 4, 5) AND (cimgs.id != 1)

EXPLAIN SELECT `cimgs`.*
FROM `cimgs_tags`
INNER JOIN `cimgs` ON `cimgs`.`id` = `cimgs_tags`.`cimg_id`
WHERE `cimgs_tags`.`tag_id` IN (1, 2, 3, 4, 5) AND (cimgs.id != 1)

看到差异。

Offcourse,对于LEFT JOIN或RIGHT JOIN,存在语义差异。

答案 1 :(得分:3)

INNER JOINS并不重要。同样的方式也没有WHERE子句顺序

WHERE `cimgs_tags`.`tag_id` IN (1, 2, 3, 4, 5) AND (cimgs.id != 1)

WHERE (cimgs.id != 1) AND `cimgs_tags`.`tag_id` IN (1, 2, 3, 4, 5)
  • 优化者知道这个
  • SQL是声明性的而不是程序性的。也就是说,你说“什么”和优化者决定“如何”

答案 2 :(得分:0)

我相信this question

回答你的问题。

“对于内连接,顺序无关紧要。
对于外连接,顺序很重要。
如果您想强制执行某个订单,可以使用STRAIGHT_JOIN。“