資料庫 簡述分頁查詢的優化方案

2021-10-01 02:32:54 字數 2775 閱讀 9143

當需要從資料庫查詢的表有上萬條記錄的時候,一次性查詢所有結果會變得很慢,特別是隨著資料量的增加特別明顯,這時需要使用分頁查詢。對於資料庫分頁查詢,也有很多優化的方案。下面簡單說一些方法。

一般的分頁查詢使用簡單的 limit 子句就可以實現。limit 子句宣告如下:

select * from table limit offset, rows

select * from table limit rows

limit 子句可以被用於指定 select 語句返回的記錄數。需注意以下幾點:

下面是乙個應用例項,該條語句將會從表中查詢1000開始之後的10條資料,也就是第1001條到第1010條資料。

select * from table limit 1000,10;
資料表中的記錄預設使用主鍵(一般為id)排序。

測試-1 : 針對查詢量的測試

select * from table limit 10000,1;

select * from table limit 10000,10;

select * from table limit 10000,100;

select * from table limit 10000,1000;

select * from table limit 10000,10000;

三次耗時如下:

查詢1條記錄:3072ms 3092ms 3002ms

查詢10條記錄:3081ms 3077ms 3032ms

查詢100條記錄:3118ms 3200ms 3128ms

查詢1000條記錄:3412ms 3468ms 3394ms

查詢10000條記錄:3749ms 3802ms 3696ms

結論-1:在查詢記錄量低於100時,查詢時間基本沒有差距,隨著查詢記錄量越來越大,所花費的時間也會越來越多。

測試-2 : 針對偏移量的測試

select * from table limit 100,100;

select * from table limit 1000,100;

select * from table limit 10000,100;

select * from table limit 100000,100;

select * from table limit 1000000,100;

三次耗時如下:

查詢100偏移:25ms 24ms 24ms

查詢1000偏移:78ms 76ms 77ms

查詢10000偏移:3092ms 3212ms 3128ms

查詢100000偏移:3878ms 3812ms 3798ms

查詢1000000偏移:14608ms 14062ms 14700ms

結論-2:隨著查詢偏移的增大,尤其查詢偏移大於10萬以後,查詢時間急劇增加。

這種分頁查詢方式會從資料庫第一條記錄開始掃瞄,所以越往後,查詢速度越慢,而且查詢的資料越多,也會拖慢總查詢速度。

子查詢的方式 : 先定位偏移位置的 id,然後往後查詢。這種方式適用於 id 遞增的情況。

select * from table limit 100000,1;

select

id from table limit 100000,1;

select * from table where id>=

(select id from table limit 100000,1) limit 100;

select * from table limit 100000,100

4條語句的查詢時間如下:

第1條語句:3674ms

說明 : 使用 select

id 代替 select * 速度增加了3倍

第2條語句:1315ms

說明 : 和第2條語句速度相差幾十毫秒

第3條語句:1327ms

說明 : 得益於 select

id 速度增加,第3條語句查詢速度增加了3倍

第4條語句:3710ms

id 限定的方式假設資料表的id是連續遞增的,則我們根據查詢的頁數和查詢的記錄數可以算出查詢的id的範圍,可以使用 id between and 來查詢:

select * from table where id between 1000000 and 1000100 limit 100;
這種查詢方式能夠極大地優化查詢速度,基本能夠在幾十毫秒之內完成。限制是只能使用於明確知道id的情況,不過一般建立表的時候,都會新增基本的id欄位,這為分頁查詢帶來很多便利。

還可以有另外一種寫法:

select * from table where id

>= 1000001 limit 100;

當然還可以使用 in 的方式來進行查詢,這種方式經常用在多表關聯的時候進行查詢,使用其他表查詢的id集合,來進行查詢:

select * from table where id in(select order_id from trade_2 where goods =

'pen'

) limit 100;

注意:某些 mysql 版本不支援在 in 子句中使用 limit。

參考 :

資料庫 分頁查詢優化

select top10 from admin where adminid notin select top1500000 adminid from admin 使用not in會引發全表掃瞄 理論上會,由於資料庫會對查詢進行優化,所以實際我並不知道會不會 其用時如下 cpu 時間 562 毫秒,占...

mysql資料庫分頁查詢優化

原博 mysql單錶百萬資料記錄分頁效能優化 limit優化 當資料很多需要進行分頁查詢時 需要先查出第一條資料的id然後根據id查詢大於id的資料 limt 一頁的資料量 1.直接用limit start,count分頁語句,也是我程式中用的方法 select from product limit...

海量資料庫的查詢優化及分頁演算法方案

create procedure pagination3 tblname varchar 255 表名 strgetfields varchar 1000 需要返回的列 fldname varchar 255 排序的欄位名 pagesize int 10,頁尺寸 pageindex int 1,頁碼...