[英]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.