當需要從數據庫查詢的表有上萬條記錄的時候,一次性查詢所有結果會變得很慢,特別是隨着數據量的增加特別明顯,這時就需要使用分頁查詢
數據準備
表名: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();
}