我有两个表,新闻和news_views。每次浏览一篇文章时,新闻id、IP地址和日期都会记录在news_views中。
我正在使用一个带有子查询的查询,通过获取每个标题在过去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发布于 2010-03-28 10:08:04
我不认为你需要以派生表的形式计算视图的数量:
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的等价物)运行这些查询,看看查询将做什么-索引扫描,表扫描,估计成本等。避免全表扫描。
https://stackoverflow.com/questions/2531636
复制相似问题