我有一個表(logs
)具有以下列(還有其他的,但這些都是重要的):MySQL的:日期範圍內優化記錄查詢
- ID(PK,INT)
- 時間戳(日期時間)(指數)
- 持續時間(INT)
基本上這是用於啓動的時間和在時間結束的事件的記錄。這張表目前有幾十萬行。我預計它會增長到數百萬。在Duration
- 結束時間(日期時間)(指數)
爲了計算結束時間我已經加入的秒數到:加快查詢的目的,我已經添加另一列和預先計算的值Timestamp
字段。
現在我想要做的是運行一個查詢,其中結果計算開始(Timestamp
)和結束時間(EndTime
)落在特定時間點之外的行數。然後,我想要在大時間範圍內(例如一年)每秒運行一次查詢。我還想計算在特定時間點開始的行數,並在特定時間點結束。
我創建了以下查詢:
SELECT
`dates`.`date`,
COUNT(*) AS `total`,
SUM(IF(`dates`.`date`=`logs`.`Timestamp`, 1, 0)) AS `new`,
SUM(IF(`dates`.`date`=`logs`.`EndTime`, 1, 0)) AS `dropped`
FROM
`logs`,
(SELECT
DATE_ADD("2010-04-13 09:45:00", INTERVAL `number` SECOND) AS `date`
FROM numbers LIMIT 120) AS dates
WHERE dates.`date` BETWEEN `logs`.`Timestamp` AND `logs`.`EndTime`
GROUP BY `dates`.`date`;
注意,號碼錶是嚴格輕易列舉的日期範圍。這是一個表,其中包含一列number
,幷包含值1,2,3,4,5等...
這給了我正是我在找什麼......一張有4列的表格:
- 日期
- 總
- 新(行即開始在這個時間點)(即啓動和當前的時間點之外年末總排)
- 下降(行爲此在這時間點)
問題是,此查詢可能需要大量的時間來執行。要經過120秒(如查詢所示),大約需要10秒。我懷疑這個速度與我要得到它的速度一樣快,但我想我會問在這裏是否有人提出改進此查詢性能的任何想法。
任何建議將是最有幫助的。感謝您的時間。
編輯:我有索引時間戳和結束時間。
EXPLAIN我查詢的輸出:
"id";"select_type";"table";"type";"possible_keys";"key";"key_len";"ref";"rows";"Extra"
"1";"PRIMARY";"<derived2>";"ALL";NULL;NULL;NULL;NULL;"120";"Using temporary; Using filesort"
"1";"PRIMARY";"logs";"ALL";"Timestamp,EndTime";NULL;NULL;NULL;"296159";"Range checked for each record (index map: 0x6)"
"2";"DERIVED";"numbers";"index";NULL;"PRIMARY";"4";NULL;"35546940";"Using index"
當我運行我的日誌表分析,它說的狀態確定。
你有什麼索引? '說明你的查詢的輸出是什麼?你有[分析](http://dev.mysql.com/doc/refman/5.1/en/analyze-table.html)'logs'表嗎? – outis 2011-03-01 22:44:25
@outis,謝謝你的問題。我已將這些信息添加到我的帖子底部。 – Brad 2011-03-01 23:40:04
分析更多的是它對查詢優化器如何使用索引的影響。現在我很好奇擴展查詢計劃是用於查詢的,特別是查看查詢是否以及如何重寫。你會在'EXPLAIN EXTENDED'查詢後發佈'SHOW WARNINGS'的結果嗎? – outis 2011-03-02 00:21:20