我有一个带有~3.5mio线的MySQL表。我想迭代每一行。由于我不想加载所有3.5mio线,我将查询分成小块。对于拆分我正在使用日期字段。
现在的问题是:当我从表中选择大于指定日期的行时,它仍然会查看每个日期,将它们放在临时列表中,而不是90%的条目,因为我只想要小部件
如何创建我的查询以便我的计算机不崩溃它会加载整个表?
答案 0 :(得分: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
谓词。在后续执行中,您将从您提取的最后一行的列中传入值,因此您将从该点开始下一个查询。