可以优化此MySQL子查询吗?

问题描述:

我有两张表,新闻和news_views。每次查看文章时,新闻标识,IP地址和日期都记录在news_views中。可以优化此MySQL子查询吗?

我正在使用带有子查询的查询来获取新闻中浏览次数最多的标题,方法是获取最近24小时内每个视图的总计数。

它工作正常,但它需要5-10秒才能运行,大概是因为news_views中有成千上万的行,它必须在完成之前通过整个表。查询如下,有没有什么办法可以改进?

SELECT n.title 
,  nv.views 
FROM news n 
LEFT 
JOIN (
     SELECT news_id 
     ,  count(DISTINCT ip) AS views 
     FROM news_views 
     WHERE datetime >= SUBDATE(now(), INTERVAL 24 HOUR) 
     GROUP 
     BY  news_id 
     ) AS nv 
ON  nv.news_id = n.id 
ORDER 
BY  views DESC 
LIMIT 15 
+2

你的桌子上有什么索引? – 2010-03-28 02:01:58

+0

没有,有什么建议吗? – Dan 2010-03-28 02:09:19

我不认为你需要计算的看法计数作为派生表:

SELECT n.id, n.title, count(DISTINCT nv.ip) AS views 
FROM news n 
LEFT JOIN news_views nv 
ON nv.news_id = n.id 
WHERE nv.datetime >= SUBDATE(now(), INTERVAL 24 HOUR) 
GROUP BY n.id, n.title 
ORDER BY views DESC LIMIT 15 

这里最好的建议是通过EXPLAIN运行这些查询(或任何MySQL的当量)查看查询将实际执行的操作 - 索引扫描,表扫描,估计成本等。避免全表扫描。

+0

您的查询将运行时间降至0.5秒以下,谢谢! – Dan 2010-03-28 02:18:47