我正在尝试将一个表中的数据子集与另一个表中的数据连接起来(下面的示例),从性能的角度来看,我想知道最好的方法是什么,以及什么是最具可扩展性的。
我尝试加入的表看起来像这样(其他表已经在查询中)。
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而不是一个连接更好吗?
对此有何建议?
答案 0 :(得分:3)
如果您对性能差异感兴趣,最简单的方法是在SELECT语句前面加上EXPLAIN。您将看到使用了哪些索引以及需要触摸的行数等等。
答案 1 :(得分:0)
如果您只是寻找经验法则并且性能相当,那么我会使用什么使它成为我理解中最合乎逻辑的。我在join子句中放置了定义两个表之间的连接的字段,并在where子句中放置了过滤条件。一般来说,如果你编写一个类似的查询并且连接条件保持不变并且只有where子句发生变化,你就知道你是对的。
答案 2 :(得分:0)
只是直接回答这个问题。从长远来看,在“where”或“on”条款中设置限制无关紧要。 mySQL将优化它们以有效地运行相同的查询(正如dnagirl解释的那样,你可以通过使用EXPLAIN看到)。像mysql工作台这样的工具可以显示运行查询所需的相对时间,这样也可以帮助回答这些问题。对于这个特定的一个,因为查询基本上是等价的,你可以使用周杰伦的建议,然后选择你认为使事情更具可读性的建议。