问题
项目中遇到对表数据全量迁移,表数据量比较大,基本上是在百万、千万级别。
方案
limit方式
首先最开始的方案就是简单粗暴最直接的Limit查询,这种方案对少量数据是可行的,但是到后面数据量大的时候
再进行limit x,y 这个时候效率会很低,会执行全表扫描,例如
select * from table limit 150000,1000;
优点
- 实现逻辑简单
缺点
- limit数据量大的时候效率低
索引方式
此方式是直接获取的满足条件的最小和最大ID(主键),然后通过ID区间的批量BETWEEN AND方式来获取数据
优点
- 每次查询都是通过索引ID来获取数据,执行效率高
缺点
- 在获取min(id)和max(id)会执行全表扫描,比较慢
- id段不连续,会出现不符合条件的空查询
public File getData() {
long min = x;
long max = y;
if (min == 0 || max == 0) {
return null;
}
long size = max - min + 1;
int batchNum = 5000;
int pageNum = size % batchNum == 0 ? (int) (size / batchNum) : (int) (size / batchNum) + 1;
ExecutorService es = Executors.newFixedThreadPool(5);
Future<Boolean>[] result = new Future[pageNum];
for (