我有一个大约 3.5mio 行的 MySQL 表。我想遍历每一行。由于我不想加载所有 3.5mio 行,因此我将查询拆分为小查询。对于拆分,我使用日期字段。
现在的问题是:当我从表中选择大于指定日期的行时,它仍然会关注每个日期,将它们放在一个临时列表中,而不是削减 90% 的条目,因为我只想要小部分。
我怎样才能创建我的查询,以便我的计算机不会崩溃它加载整个表?
我有一个大约 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
谓词。在随后的执行中,您将从您获取的最后一行的列中传递值,因此您将从该点开始您的下一个查询。