2012-03-20 112 views
0

比方說,我有以下SQL查詢使查詢更加高效

SELECT id, name, title, description, time 
    FROM entity 
    WHERE UNIXTIMESTAMP(CONCAT(date_end, time_end)) > UNIXTIMESTAMP(NOW()) 
    AND UNIXTIMESTAMP(CONCAT(next_date, next_time)) < UNIXTIMESTAMP(NOW()) 

我一直在尋找到的意見等方式,使該查詢更有效。問題是如果我有超過10,000個實體要處理;那麼查詢將需要很長時間。

MySQL提供了哪些工具來提高查詢的效率?謝謝!

+0

您是否考慮過重構數據庫表並使用'DATETIME'字段類型?或者甚至更好,'BIGINT'來存儲原始的Unix時間戳? – 2012-03-20 23:41:00

+0

「date_end」,「time_end」等的數據類型是什麼? – 2012-03-20 23:41:44

+0

什麼專欄是您的索引? – Ben 2012-03-20 23:43:00

回答

4

如果您只是使用常規技術,那麼就已經有了關於該主題的SO問題,更不用說關於optimization的MySQL手冊部分了。

如果您在查詢的特定建議之後,請注意,如果列通過函數傳遞,則MySQL不能應用索引。您需要擺脫圍繞* _end和next_ *列的UNIXTIMESTAMPCONCAT調用。一種方法是更改​​表格模式:將列組合成DATETIMETIMESTAMP類型的「結束」和「下一個」列。另一種方法是將當前時間分隔成日期和時間,並將其與單獨的列進行比較。

1

請看explain - 它會告訴你發動機蓋下發生了什麼。

1

也許看看使用日期時間字段而不是兩個字段 - 這將刪除查詢中不必要的數據轉換。

SELECT id, name, title, description, time 
FROM entity 
WHERE NOW() BETWEEN (date_time_end AND date_time_next); 

不要以爲你會比沒有根據日期劃分表格的情況好得多。

0

我認爲這應該會提高查詢性能而不改變數據庫模式。

SELECT id, name, title, description, time FROM entity 
WHERE NOW() BETWEEN ADDTIME(next_date, next_time) AND ADDTIME(date_end, time_end) 

其實BETWEEN將與>=<=比較。如果你不希望它是這樣的,那麼保持與><的比較,而不是使用BETWEEN

2

您的查詢將被罰款,只有10K的記錄過程,但是這應該是更有效,因爲它不涉及任何類型的轉換 -

SELECT id, name, title, description, time 
FROM entity 
WHERE (date_end > CURRENT_DATE OR (date_end = CURRENT_DATE AND time_end >= CURRENT_TIME)) 
AND (next_date < CURRENT_DATE OR (next_date = CURRENT_DATE AND next_time <= CURRENT_TIME)) 

上(NEXT_DATE,DATE_END)複合指數也應該有幫助性能,但如果您使用EXPLAIN來檢查執行計劃,它應該幫助您決定最有效的索引。您應該檢查(date_end,next_date)上的索引。不知道更多關於數據分佈的信息,不可能說哪一個最能提供幫助。

+0

所以我做了你所設想的。我添加了索引(next_date,date_end),但由於某種原因,當我對您提供的查詢調用EXPLAIN時,它並未使用我創建的索引。 ..? – Jasmine 2012-03-21 00:11:27

+0

您是否嘗試過使用索引?您可以嘗試使用[FORCE INDEX](http://dev.mysql.com/doc/refman/5.1/en/index-hints.html)嘗試索引來查看它們對執行計劃的影響。 – nnichols 2012-03-21 00:22:54