














做数据迁移,把一个200多万的表数据,迁移到另外一个表。需要把原来的读取出来,一次不能读取完,分页读取,使用mysql 的limit offset
这个表有自增主键、mnt_tm维护时间字段。mnt_tm有索引
开始我想着通过mnt_tm排序分页查询
select xx, yy from t1 order by mnt_tm desc limit 0, 100
后台定时分页查询,插入另外一张表
代码一上线,就有很多慢查询,超过2秒的
mnt_tm有索引,但是默认是升序的。这里可能会重排序,导致慢查询。
如果没有order by,运行久了也会有深分页的问题。limit 10000,10也会很慢,因为需要扫描前100000条数据。数据库节点数据大小不一样,不能像索引一样,直接随机访问。还有存储是离散存储的,不像数组一样在内存中是连续存储的,可以计算出随机访问的地址。
这里我了解到的几种解决方案
1. 按天查询
看数据分布,每天最多只有2万多条数据。mnt_tm有索引,虽然时候分页查询,目的不一样,不是在页面展示,所以不用每页大小一致。解决实际问题为目标
2.使用子查询
子查询找出id,然后关联。子查询查询id,索引覆盖,很快。找出一页id数据,在关联,就页大小 * 每条数据查询时间
还有其他的游标之类的。可以问下大模型。
几年前我面试的时候,也遇到这个问题,今天才基本了解清楚问题原因和解决方案
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。