繁体   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