0

我有一个大约 3.5mio 行的 MySQL 表。我想遍历每一行。由于我不想加载所有 3.5mio 行,因此我将查询拆分为小查询。对于拆分,我使用日期字段。

现在的问题是:当我从表中选择大于指定日期的行时,它仍然会关注每个日期,将它们放在一个临时列表中,而不是削减 90% 的条目,因为我只想要小部分。

我怎样才能创建我的查询,以便我的计算机不会崩溃它加载整个表?

4

1 回答 1

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谓词。在随后的执行中,您将从您获取的最后一行的列中传递值,因此您将从该点开始您的下一个查询。

于 2012-07-09T21:42:14.350 回答