加入数据的位置,还是把它放在where子句中?

时间:2009-09-21 18:07:28

标签: mysql join

我正在尝试将一个表中的数据子集与另一个表中的数据连接起来(下面的示例),从性能的角度来看,我想知道最好的方法是什么,以及什么是最具可扩展性的。

我尝试加入的表看起来像这样(其他表已经在查询中)。

vid             kid         uid
1                34          12
1                34          15
2                22          18
2                34          18
2                22          15

我的查询就像这样

SELECT * FROM similar 
RIGHT OUTER JOIN(SELECT event.stuff,  eventdate.stuffshows
FROM events
JOIN evendate ON events.eid=eventdate.eid
WHERE location= 'Paris'
AND event.date
BETWEEN '2009-08-14'
AND '2009-08-17'
GROUP BY event.date
ORDER BY event.date
LIMIT 0 , 5
) mystuff ON event.bid = similar.id
AND event.date=similar.date

我想我可以进入

SELECT * FROM similar 
RIGHT OUTER JOIN(SELECT event.stuff,  eventdate.stuffshows
FROM events
JOIN evendate ON events.eid=eventdate.eid
WHERE 
user.vid=events.vid AND user.uid=15 AND user.kid=22
location= 'Paris'
AND event.date
BETWEEN '2009-08-14'
AND '2009-08-17'
GROUP BY event.date
ORDER BY event.date
LIMIT 0 , 5
) mystuff ON event.bid = similar.id
AND event.date=similar.date

我担心的是,我有点混合了一个地方。是否值得为user.vid = events.vid设置第二个JOIN的性能?或者做一个WHERE而不是一个连接更好吗?

对此有何建议?

3 个答案:

答案 0 :(得分:3)

如果您对性能差异感兴趣,最简单的方法是在SELECT语句前面加上EXPLAIN。您将看到使用了哪些索引以及需要触摸的行数等等。

答案 1 :(得分:0)

如果您只是寻找经验法则并且性能相当,那么我会使用什么使它成为我理解中最合乎逻辑的。我在join子句中放置了定义两个表之间的连接的字段,并在where子句中放置了过滤条件。一般来说,如果你编写一个类似的查询并且连接条件保持不变并且只有where子句发生变化,你就知道你是对的。

答案 2 :(得分:0)

只是直接回答这个问题。从长远来看,在“where”或“on”条款中设置限制无关紧要。 mySQL将优化它们以有效地运行相同的查询(正如dnagirl解释的那样,你可以通过使用EXPLAIN看到)。像mysql工作台这样的工具可以显示运行查询所需的相对时间,这样也可以帮助回答这些问题。对于这个特定的一个,因为查询基本上是等价的,你可以使用周杰伦的建议,然后选择你认为使事情更具可读性的建议。