我想从网站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
答案 0 :(得分:0)
使用内连接时,所有三个都在语义上等效。
我更喜欢第一种方法,因为它使join
显式化,并将连接的条件放在一个地方。其他人冒的风险是,在查询的不同部分更改常量可能会对连接产生意外影响。
最后一个,使用子查询可能会对性能产生一些影响。 MySQL倾向于实现子查询。结果,性能可能会有点差。
编辑:
如上所述,它们与left outer join
相同,但与right outer join
或where
条件在gallery
上的情况不同。
在外连接中,on
子句中的过滤器不会影响第一个表中的填充。连接的逻辑是“如果匹配则返回一行。如果”外连接“表中的值根本不匹配,则仍然返回该行”。另一方面,where
确实在加入后进行过滤。
答案 1 :(得分:0)
查询1和2与性能完全相同。查询3将明显变慢。当然,查询1和2的性能取决于索引。您应该在表website
中的列gallery
上创建索引,并在表id
中的列website
,category
上建立索引。