SQL分頁查詢優化

2021-04-02 03:05:35 字數 2210 閱讀 9975

基於如下基礎分頁方案

select top 頁大小 *

from table1

where id>

(select max (id) from

(select top ((頁碼-1)*頁大小) id from table1 order by id) as t --瓶頸 )

order by id

隨著分頁數的上公升,儘管只選取了id列,但量上仍然很驚人,關鍵就是top得太多》:

改進點也就出在這裡:

1、一分為二

因為 紀錄中點 = 總紀錄數/2,如果超過紀錄中點,改變一下order的順序(降序公升序),

由x = ((頁碼-1)*頁大小),更改相應的top數(總紀錄-x)

--降序排列

select top 頁大小 * from 表 where id <

(select min(id)

from

(select top x id from 表 order by id desc) as tbltmp)

order by id desc

--公升序排列

select top 頁大小 * from 表 where id >

(select max(id)

from

(select top 總記錄-x id from 表 order by id asc) as tbltmp)

order by id asc

以上只是分段紀錄集的特例,我們完全可以通過sql計算出1/4,1/8,1/16,1/32……等不同情況下的紀錄臨界,進一步縮小結果集。

2、top 10

儘管乙個n大的表可以分為n/pagesize多的頁,不過現實情況是,很少有人會一頁一頁的翻到10000頁,統計概率告訴我們,乙個人的翻頁的耐心很少有大於10的,80%的翻頁又集中在前20%,也就是前兩頁!

2.1 預載

我們可以不用吹灰之力預先計算出top 10頁的臨界id:

select max (id) from

(select top ((頁碼-1)*頁大小) id from table1 order by id) as t

然後放入[1][2][3][……]這樣的分頁鏈結中(形如showpage.asp?id=1000),用

select top 頁大小 *

from table1

where id>querystring(id)

輕鬆實現分頁。

2.2 setp by setp

更幸運的是,絕大多數情況下,人們是一頁接一頁的翻閱,於是,我們還有針對這90%+情況的更優的解決方案。

首先開啟第一頁,我們得到第一頁最後一條紀錄的id,這就是第二頁分頁的初始id!

如果開啟第n頁,那麼第一條記錄的id就是max(n-1頁紀錄id)+1,最後一條紀錄就是min(n+1頁紀錄id)-1,用所得到的id更改臨近頁面的url;

公升序排列:

--n-1頁

select top 頁大小 *

from table1

where id < min_id order order by id asc

--n+1頁

select top 頁大小 *

from table1

where id > max_id order order by id asc

降序排列:

--n-1頁

select top 頁大小 *

from table1

where id > max_id order order by id desc

--n+1頁

select top 頁大小 *

from table1

where id < min_id order order by id desc

SQL 分頁查詢優化

先使用範圍查詢定位 id 或者索引 然後再使用索引進行定位資料,能夠提高好幾倍查詢速度。即先 select id,然後再 select select from orders history where type 8 limit 1000,10 select from orders history w...

sql分頁優化

注意查詢的資料佔總資料達到一定量的時候可能導致索引失效。可以用limit或者指定列縮小資料區域可以解決。前提用order by分頁 limit分頁在兩三萬左右時可以使用,超過十萬條記錄時要先查詢出前n 1頁的時間最大值max date 以這個為開始時間。這裡變動的引數只有下面的300000,這裡為查...

分頁查詢優化

1 子查詢優化法 先找出第一條資料,然後大於等於這條資料的id就是要獲取的資料 缺點 資料必須是連續的,可以說不能有where條件,where條件會篩選資料,導致資料失去連續性。實驗下 如下 複製 mysql set profiling 1 query ok,0 rows affected 0.00...