我知道以下查询返回相同的内容:
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是否会自动检测并优化它,但这两个查询的性能是否相似?
答案 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)
答案 2 :(得分:0)