簡體   English   中英

MySQL JOIN具有一個普通條件和一個交叉表條件的兩個表

[英]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的性能取決於索引。 你應該創建列的索引websitegallery和索引的列idwebsitecategory

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM