0
我有〜3.5mio線MySQL表。我想遍歷每一行。由於我不想加載所有3.5兆行,因此我將查詢拆分爲小數據。對於分割我使用日期字段。巨大的數據集,ORDER BY日期和限制
現在的問題是:當我從表中選擇線條大於指定日期時,它仍然照顧每一個日期,把它們放在一個臨時列表中,並削減90%的條目,因爲我只想要小部分。
如何創建我的查詢,以便我的電腦不死機加載整個表?
我有〜3.5mio線MySQL表。我想遍歷每一行。由於我不想加載所有3.5兆行,因此我將查詢拆分爲小數據。對於分割我使用日期字段。巨大的數據集,ORDER BY日期和限制
現在的問題是:當我從表中選擇線條大於指定日期時,它仍然照顧每一個日期,把它們放在一個臨時列表中,並削減90%的條目,因爲我只想要小部分。
如何創建我的查詢,以便我的電腦不死機加載整個表?
簡短的回答是,以確保您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
謂語。在隨後的執行中,您將傳入您獲取的最後一行的列中的值,以便從該點開始您的下一個查詢。
你有你的表中的任何索引? – Taryn 2012-07-09 21:35:23
還沒有。建議在我的日期欄中使用索引嗎? – user1406177 2012-07-09 21:41:38
我的建議是首先嚐試查看它是否對您的查詢進行了改進。我的猜測是會的。 – Taryn 2012-07-09 21:42:46