2010-03-28 130 views
1

我有兩張表,新聞和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

回答

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的當量)查看查詢將實際執行的操作 - 索引掃描,表掃描,估計成本等。避免全表掃描。

+0

您的查詢將運行時間降至0.5秒以下,謝謝! – Dan 2010-03-28 02:18:47