2012-07-09 44 views
0

我有〜3.5mio線MySQL表。我想遍歷每一行。由於我不想加載所有3.5兆行,因此我將查詢拆分爲小數據。對於分割我使用日期字段。巨大的數據集,ORDER BY日期和限制

現在的問題是:當我從表中選擇線條大於指定日期時,它仍然照顧每一個日期,把它們放在一個臨時列表中,並削減90%的條目,因爲我只想要小部分。

如何創建我的查詢,以便我的電腦不死機加載整個表?

+3

你有你的表中的任何索引? – Taryn 2012-07-09 21:35:23

+0

還沒有。建議在我的日期欄中使用索引嗎? – user1406177 2012-07-09 21:41:38

+0

我的建議是首先嚐試查看它是否對您的查詢進行了改進。我的猜測是會的。 – Taryn 2012-07-09 21:42:46

回答

1

簡短的回答是,以確保您ORDER BY可以使用索引,而不需要文件排序操作得到滿足。

您可以使用EXPLAIN SELECT ...得到的查詢計劃。

EXPLAIN 
SELECT t.* 
    FROM mytable t FORCE INDEX FOR ORDER BY (mytable_IX1) 
WHERE t.created_at > @last_created_at 
    OR t.created_at = @last_created_at AND t.id > @last_id 
ORDER BY t.created_at, t.id 
LIMIT 1000 


id select_type table type possible_keys key   key_len ref rows Extra   
-- ----------- ------ ----- ------------- ----------- ------- ------ ---- ------------- 
1 SIMPLE  t  range mytable_IX1 mytable_IX1 13  (NULL) 1000 Using where; Using index 

在第一次執行時,你只需要一個t.created_at IS NOT NULL謂語。在隨後的執行中,您將傳入您獲取的最後一行的列中的值,以便從該點開始您的下一個查詢。