当需要从数据库查询的表有上万条记录的时候,一次性查询所有结果会变得很慢,特别是随着数据量的增加特别明显,这时就需要使用分页查询
数据准备
表名:report_sample
描述:获取执行性能报告数据
主要字段:task_id, seconds, elapsed
字段情况:该表10个字段
数据量:1000w+
一次查询出所有记录
不使用分页查询的情况下,一次查询出表中的所有记录,也就是全表扫描
select
count(*)
from
report_sample
where
task_id = '45eff63a74944f6eb9bef93d8cf04f13';
---297843
执行查询的时间约92s
实际的项目当然是不可能进行全表扫描的一次性查询出所有记录的做法,这样会因为数据的响应、传输和装载过慢而影响页面渲染的性能,严重影响用户体验,甚至可能会导致内容溢出
一般的分页查询
select * from table limit [offset,] rows | rows offset offset
limit子句可以被用于指定select语句返回的记录数,以下是使用limit子句的注意事项:
- 第一个参数指定第一个返回记录行的偏移量,注意从0开始
- 第二个参数指定返回记录行的最大数目
- 如果只给定一个参数,这个参数表示返回的最大记录行数目
- 如果第二个参数值为-1,那么就表示检索从某一个偏移量到记录集的结束所有的记录行
- 初始记录行的偏移量是0,而不是1
使用栗子
// 查询出所有的数据
Integer num = reportSampleDao.getSampleCount(taskId);
// 分页读取
for (int i = 0; i < leaf; i++) {
int finalI = i;
new Thread(() -> {
List<ReportSampleDto> reportSampleDto = reportSampleDao.getSampleOffset(taskId,finalI*num/leaf,num/leaf);
collect.addAll(reportSampleDto);
countDownLatch.countDown();
}).start();
}