我有一个包含约 3.5mio 行的 MySQL 表。我想迭代每一行。由于我不想加载所有 3.5mio 行,因此我将查询拆分为小查询。对于分割,我使用日期字段。
现在的问题是:当我从表中选择大于指定日期的行时,它仍然会查找每个日期,将它们放入临时列表中,然后删除 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
谓词。在后续执行中,您将传入所获取的最后一行的列中的值,因此您将从该点开始下一个查询。
关于mysql - 庞大的数据集,按日期和限制排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11403522/