加入3个表比更好的方法是什么?

时间:2011-01-28 00:33:21

标签: sql mysql query-optimization

我必须在项目的某个地方加入3张桌子 以下是示例表和列:

Table-1 : posts 
Columns1: id,owner,title,post,keywords

Table-2 : sites
Columns2: id,name,url

Table-3 : views
Columns3: id,post,view

当我加入所有这些表时,它发生了如此大的问题:

SELECT title,post,keywords,name,url,view
FROM posts 
LEFT JOIN sites ON sites.id=posts.owner 
LEFT JOIN views ON views.post = post.id 
WHERE posts.date BETWEEN '2010-10-10 00:00:00' AND '2010-11-11 00:00:00' 
ORDER BY views.view DESC 
LIMIT 0,10

这是唯一的方法,还是我可以采取其他措施来获得更好的表现?

这是我当前的查询的EXPLAIN。上面只是一个例子。 MysqlFront EXPLAIN Result

4 个答案:

答案 0 :(得分:2)

这不是一个特别“大”的查询。您是否运行了查询分析器并检查了慢点的位置,然后检查了索引?

Re:Analyzer - 微软一直在推动它,但在2008年Management Studio中有几种显示执行计划的选项。一旦看到执行计划,您就可以看到问题所在。寻找单个动作,花费80%的时间并专注于此。像Table Scans这样的事情表明你可以通过调整索引加快速度。 (索引也有缺点,但稍后会担心)。

答案 1 :(得分:2)

这不是任何想象力的大问题。

它真的有多慢?

如果视图不包含比您显示的信息更多的信息,那么您应该只有一个视图计数作为帖子的字段。除非您实际存储有关视图本身的一些信息,例如用户代理字符串或时间,否则无需将其作为自己的单独表格。

答案 2 :(得分:0)

如果您的POSTS表格特别大(> 100K行?),那么您可以做的一件事就是将时间过滤的帖子加载到临时表中并加入该临时表。

答案 3 :(得分:0)

如果您的关系得到保证,换句话说就是不可为空的外键,那么如果查询使用内部联接而不是左联接,则查询会表现得更好。虽然这个查询看起来不够大或太复杂,不足以严重影响性能问题。

相关问题