【问题标题】:Can this MySQL subquery be optimised?这个 MySQL 子查询可以优化吗?
【发布时间】:2010-03-28 01:58:23
【问题描述】:

我有两个表,news 和 news_views。每次查看文章时,news_views 中都会记录新闻 id、IP 地址和日期。

我正在使用带有子查询的查询来获取新闻中观看次数最多的标题,方法是获取每个标题在过去 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

【问题讨论】:

  • 您的表上有哪些索引?

标签: mysql optimization subquery


【解决方案1】:

我认为您不需要将视图计数计算为派生表:

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.5 秒以下,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-25
  • 1970-01-01
相关资源
最近更新 更多