2012-08-01 125 views
0

我有一個包含100M記錄的數據庫表。我有一個需要20分鐘才能運行的查詢 - 我怎樣才能簡單快捷?Mysql數據庫龐大記錄

SELECT newnum, 
     Sum(Ceil(seconds/60)) AS ttime 
FROM astb 
GROUP BY newnum 
ORDER BY ttime DESC 
LIMIT 100; 
+0

你有沒有索引在桌子上? – Bridge 2012-08-01 08:56:17

+0

您是否在該查詢中缺少GROUP BY? – Barmar 2012-08-01 09:08:06

+0

@Barmar我已更新我的查詢。 – 2012-08-01 09:22:10

回答

0

ORDER BYLIMIT最適合索引。所以如果可能的話,你可以在列newnum上有索引。

另一點是你正在計算一張巨大的表中的每一條記錄。我強烈建議先選擇臨時表中的記錄,然後再對這些記錄進行計算。

編輯更新後的腳本:你可以使用臨時表是這樣的:

CREATE TEMPORARY TABLE temp AS 
(SELECT newnum, SUM(seconds) AS ttime 
FROM astb GROUP BY newnum) 

SELECT newnum, CEIL(ttime/60) AS ttime 
FROM temp 
ORDER BY ttime DESC 
LIMIT 100; 

DROP TABLE temp; 
+0

ttime不是一列,它是總和的結果。 – Barmar 2012-08-01 09:07:16

+0

我已將此表編入索引,但它佔用了太多時間。 我怎樣才能做臨時表... – 2012-08-01 09:26:03

+0

我編輯了列名。如果你已經有索引,那麼值得嘗試臨時表而不是計算。在這種情況下,它很複雜,因爲您想按計算字段進行排序和限制。我想你可以嘗試在一個臨時表中插入總和,然後將其轉換秒並從臨時表中排序?是否有意義? – huzeyfe 2012-08-01 09:29:47

0

這不是很大的數據庫設計,但可以添加一個列,以保存ceil(seconds/60),所以你不必重新計算其所有時間?