mysql - 庞大的数据集,按日期和限制排序

标签 mysql sql-order-by limit

我有一个包含约 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/

相关文章:

mysql - 如何在 MySQL 中返回数据透视表输出?

java - 使用 JPA 在 jpql 中按时间戳进行分组

mysql - 按包含姓名的字段对结果进行排序

php - MySQL + PHP : Pull down 1000 entries at a time, 递增到下一个 1000,重复

php - mysql查询与2个表的一些计算

mysql - 为什么 MySQL 慢查询日志锁定时间中不包含事务时间

php - 防止访问者每天发布超过 2 个帖子的方法(PHP MySQL)

javascript - Node.JS:处理服务器每分钟最大请求的最佳方式

MySQL:WHERE status NOT LIKE 'example%' 未返回 NULL 状态的结果

postgresql - postgres `order by` 参数类型