我有一张有大约900万条记录的table。当我尝试选择具有大偏移量的记录(用于分页)时,它会将执行时间增加到非常大的值。甚至导致超过内存限制而失败。
下面是两个不同偏移量值的查询日志。
选择*where set \u date>=“2019-10-11 11:05:00”和set \u date<=“2019-10-19 18:09:59”order by id asc limit 1 offset 30
Elapsed: 0.729 sec. Processed 9.92 million rows, 3.06 GB (13.61 million rows/s., 4.19 GB/s.)
MemoryTracker: Peak memory usage (for query): 181.65 MiB.
选择*where set \u date>=“2019-10-11 11:05:00”和set \u date<=“2019-10-19 18:09:59”order by id asc limit 1 offset 3000000
Elapsed: 6.301 sec. Processed 9.92 million rows, 3.06 GB (1.57 million rows/s., 485.35 MB/s.)
MemoryTracker: Peak memory usage (for query): 5.89 GiB.
1条答案
按热度按时间tzdcorbm1#
所有数据库包括ch实现
OFFSET
同样的方法。他们只是读所有的行然后跳过OFFSET
在结果集中。没有优化上升到抵消3000000的权利。https://www.eversql.com/faster-pagination-in-mysql-why-order-by-with-limit-and-offset-is-slow/
尝试禁用“优化读取”以修复内存使用情况