一、mysql分頁查詢mysql
方式1:sql
select * from table order by id limit m, n;
該語句的意思爲,查詢m+n條記錄,去掉前m條,返回後n條記錄。無疑該查詢可以實現分頁功能,可是若是m的值越大,查詢的性能會越低(越後面的頁數,查詢性能越低),由於MySQL一樣須要掃描過m+n條記錄。數據庫
方式2:oracle
select * from table where id > #max_id# order by id limit n;
該查詢每次會返回n條記錄,卻無需像方式1掃描過m條記錄,在大數據量的分頁狀況下,性能能夠明顯好於方式1,但該分頁查詢必需要每次查詢時拿到上一次查 詢(上一頁)的一個最大id(或最小id)。該查詢的問題就在於,咱們有時沒有辦法拿到上一次查詢(上一頁)的最大id(或最小id),好比當前在第3 頁,須要查詢第5頁的數據,該查詢方法便心有餘而力不足了。函數
方式3:性能
爲了不可以實現方式2不能實現的查詢,就一樣須要使用到limit m, n子句,爲了性能,就須要將m的值盡力的小,好比當前在第3頁,須要查詢第5頁,每頁10條數據,當前第3頁的最大id爲#max_id#:大數據
select * from table where id > #max_id# order by id limit 20, 10;
其實該查詢方式是部分解決了方式2的問題,但若是當前在第2頁,須要查詢第100頁或1000頁,性能仍然會較差。spa
方式4:code
select * from table as a inner join (select id from table order by id limit m, n) as b on a.id = b.id order by a.id;
該查詢同方式1同樣,m的值可能很大,但因爲內部的子查詢只掃描了字段id,而不是整張表,因此性能要強於方式1查詢,而且該查詢可以解決方式2和方式3不能解決的問題。server
方式5:
select * from table where id > (select id from table order by id limit m, 1) limit n;
該查詢方式同方式4,一樣經過子查詢掃描字段id,效果同方式4。至於性能的話,方式5的性能會略好於方式4,由於方式5不須要在進行表的關聯,而是一個簡單的比較。
二、sql server分頁查詢
方式1:
假設頁數是10,如今要拿出第5頁的內容,查詢語句以下:
--10表明分頁的大小
select top 10 * from test where id not in ( --40是這麼計算出來的:10*(5-1) select top 40 id from test order by id ) order by id
原理:須要拿出數據庫的第5頁,就是40-50條記錄。首先拿出數據庫中的前40條記錄的id值,而後再拿出剩餘部分的前10條元素
方式2:
仍是以上面的結果爲例,採用另外的一種方法
--數據的意思和上面說起的同樣
select top 10 * from test where id > ( select isnull(max(id),0) from ( select top 40 id from test order by id ) A ) order by id
原理:先查詢前40條記錄,而後得到其最id值,若是id值爲null的,那麼就返回0,而後查詢id值大於前40條記錄的最大id值的記錄。這個查詢有一個條件,就是id必須是int類型的。
方式3:
select top 10 * from ( select row_number() over(order by id) as rownumber,* from test ) A where rownumber > 40
原理:先把表中的全部數據都按照一個rowNumber進行排序,而後查詢rownuber大於40的前十條記錄
這種方法和oracle中的一種分頁方式相似,不過只支持2005版本以上的
方式4:
存儲過程查詢
建立存儲過程
alter procedure pageDemo @pageSize int, @page int AS declare @temp int set @temp=@pageSize*(@page - 1) begin select top (select @pageSize) * from test where id not in (select top (select @temp) id from test) order by id end 執行存儲過程 exec 10,5
三、oracle分頁查詢
方式1:
根據ROWID來分
select * from t_xiaoxi where rowid in(select rid from (select rownum rn,rid from(select rowid rid,cid from t_xiaoxi order by cid desc) where rownum<10000) where rn>9980) order by cid desc;
執行時間0.03秒
方式2:
按分析函數來分
select * from (select t.*,row_number() over(order by cid desc) rk from t_xiaoxi t) where rk<10000 and rk>9980;
執行時間1.01秒
方式3:
按ROWNUM來分
select * from(select t.*,rownum rn from(select * from t_xiaoxi order by cid desc) t where rownum<10000) where
rn>9980;執行時間0.1秒
其中t_xiaoxi爲表名稱,cid爲表的關鍵字段,取按CID降序排序後的第9981-9999條記錄,t_xiaoxi表有70000多條記錄
我的感受1的效率最好,3次之,2最差
致謝:感謝您的耐心閱讀!