2010-04-29 43 views
3

我將時間戳存儲爲int字段。並且在大型表上,因爲我使用的是mysql函數FROM_UNIXTIME,所以在日期中插入行需要很長的時間。作爲int字段的時間戳,查詢性能

SELECT * FROM table WHERE FROM_UNIXTIME(timestamp_field, '%Y-%m-%d') = '2010-04-04' 

是否有任何方法來加快此查詢?也許我應該使用timestamp_field >= x AND timestamp_field < y來查詢行嗎?

謝謝


EDITED這個查詢的偉大工程,但你應該照顧指數對timestamp_field

SELECT * FROM table WHERE 
timestamp_field >= UNIX_TIMESTAMP('2010-04-14 00:00:00') 
AND timestamp_field <= UNIX_TIMESTAMP('2010-04-14 23:59:59') 
+0

請爲您的表發佈「SHOW CREATE TABLE table」。在該查詢中,將小寫的'table'更改爲您的真實表名,但不是大寫的TABLE,因爲這是該命令的一部分。 – 2010-04-29 15:34:00

回答

3

使用UNIX_TIMESTAMP上不斷的替代FROM_UNIXTIME在列:

SELECT * FROM table 
WHERE timestamp_field 
    BETWEEN UNIX_TIMESTAMP('2010-04-14 00:00:00') 
     AND UNIX_TIMESTAMP('2010-04-14 23:59:59') 

這可能是更快,因爲它允許數據庫在列timestamp_field使用索引(如果存在)。在列上使用FROM_UNIXTIME等非sargable函數時,數據庫不可能使用索引。

如果您沒有timestamp_field的索引,請添加一個。

完成此操作後,您還可以嘗試通過選擇需要的列而不是使用SELECT *來進一步提高性能。

+0

有你的想法!但是,您的查詢返回0行,而從我的「EDITED」返回行查詢。如果timestamp_field是TIMESTAMP,但不是INT,我認爲你已經混淆了timestamp_field = DATE('2010-04-04')。 – Kirzilla 2010-04-29 15:18:11

+0

@Kirzilla:是的,你編輯的版本是正確的。如果這不是很快,那很可能是因爲你在timestamp_field上沒有索引。在timestamp_field上創建一個索引以快速查詢。如果你相信你已經有了timestamp_field的索引,那麼請爲你的表發佈「SHOW CREATE TABLE table」。 – 2010-04-29 15:24:05

+0

你說得對。通過索引,它的工作非常快。謝謝您的回答。 – Kirzilla 2010-04-29 16:03:46

0

如果你能,這將是更快要麼日期存儲爲一個適當的日期時間字段,或者,在代碼運行查詢,轉換你Unix時間戳後是日期然後將其發送到查詢。

FROM_UNIXTIME必須先轉換表中的每個記錄,然後才能檢查它,如您所見,它有性能問題。使用與您在查詢中實際使用的數據類型最接近的本機數據類型,或者使用列的數據類型查詢是最快的方法。因此,如果您需要繼續使用int字段來處理您的時間,那麼是的,對嚴格整數使用<>會大大提高性能,假設您將事物存儲到第二個位置,而不是將時間戳存儲到第二個位置當天中午。