[英]MySQL JOIN two tables with one common condition and one cross table condition
我想从网站5中选择所有画廊,并加入其类别以显示类别的名称。 我的问题是:就速度而言,以下三种选择此数据的方法是否相同或不同?
1)
SELECT *
FROM `gallery`
JOIN `category`
ON
`gallery`.`category` = `category`.`id` AND
`gallery`.`website` = `category`.`website`
WHERE `gallery`.`website` = 5
2)
SELECT *
FROM `gallery`
JOIN `category`
ON
`gallery`.`category` = `category`.`id` AND
`category`.`website` = 5
WHERE `gallery`.`website` = 5
3)
SELECT *
FROM `gallery`
JOIN (
SELECT *
FROM `category`
WHERE `website` = 5
) `category`
ON `gallery`.`category` = `category`.`id`
WHERE `gallery`.`website` = 5
使用内部联接时,这三个在语义上都是等效的。
我更喜欢第一种方法,因为它使得join
明确,并提出了加入一个地方的条件。 其他人则冒着风险,即在查询的不同部分更改常量可能会对联接产生意外影响。
最后一个,使用子查询可能会影响性能。 MySQL倾向于实现子查询。 结果,性能可能会更差。
编辑:
如所写,对于left outer join
,它们是相同的,但是对于right outer join
或者where
条件在gallery
上,它们将是不同的。
在外部联接中, on
子句中的过滤器不会影响第一个表中的填充。 联接的逻辑是“如果有匹配项,则返回一行。如果“外部联接”表中的值完全不匹配,则无论如何都要返回该行”。 另一方面,联接后where
进行过滤。
查询1和2与性能完全相同。 查询3将明显变慢。 当然,查询1和2的性能取决于索引。 你应该创建列的索引website
表gallery
和索引的列id
, website
表category
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.