这个MySQL子查询可以优化吗?

时间:2010-03-28 01:58:24

标签: mysql optimization subquery

我有两张桌子,新闻和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

1 个答案:

答案 0 :(得分:2)

我认为你不需要计算作为派生表的视图数量:

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的等价物)来运行这些查询,以查看查询将实际执行的操作 - 索引扫描,表扫描,估计成本等。避免全表扫描。