本文旨在介紹一種對資料庫中的大資料量**進行分頁查詢的實現方法,該方法對應用伺服器、資料庫伺服器、查詢客戶端的cpu和記憶體占用都較低,查詢速度較快,是乙個較為理想的分頁查詢實現方案。
1.問題的提出
在軟體開發中,大資料量的查詢是乙個常見的問題,經常會遇到對大量資料進行查詢的場景。常見的對大資料量查詢的解決方案有以下兩種:一、將全部資料先查找到記憶體中,然後在記憶體中進行分頁,這種方式對記憶體占用較大,必須限制一次查詢的資料量。二、採用儲存過程在資料庫中進行分頁,這種方式對資料庫的依賴較大,不同的資料庫實現機制不通,並且查詢效率不夠理想。以上兩種方式對使用者來說都不夠友好。
2.解決思路
通過在待查詢的資料庫表上增加乙個用於查詢的自增長字段,然後採用該欄位進行分頁查詢,可以很好地解決這個問題。下面舉例說明這種分頁查詢方案。
一、在待查詢的**上增加乙個long型的自增長列,取名為「queryid」,mssql、sybase直接支援自增長字段,oracle可以用sequence和trigger來實現。然後在該列上加上乙個索引。新增queryid列的語句如下:
mssql: [queryid] [bigint] identity (1, 1)
sybase: queryid numeric(19) identity www.yueluo.net
oracle:
create sequence queryid_s
increment by 1
start with 1
maxvalue 999999999999999 minvalue 1
cycle
cache 20
order;
create or replace trigger queryid_t before insert
on "test_table"
for each row
begin
select queryid_s.nextval into :new.queryid from dual;
end;
二、在查詢第一頁時,先按照大小順序的倒序查出所有的queryid,語句如下:select queryid from test_table where + 查詢條件 +order by queryid desc 。因為只是查詢queryid欄位,即使**中的資料量很大,該查詢也會很快得到結果。然後將得到的queryid儲存在應用伺服器的乙個陣列中。 字串9
三、使用者在客戶端進行翻頁操作時,客戶端將待查詢的頁號作為引數傳遞給應用伺服器,伺服器通過頁號和queyid陣列算出待查詢的queyid最大和最小值,然後進行查詢。
算出queyid最大和最小值的演算法如下,其中page為待查詢的頁號,pagesize為每頁的大小,queryids為第二步生成的queryid陣列:
int startrow = (page - 1) * pagesize;
int endrow = page * pagesize - 1;
if (endrow >=queryids.length)
long startid =queryids[startrow];
long endid =queryids[endrow];
查詢語句如下:
string sql = "select * from test_table" + 查詢條件 + "(queryid <= " + startid + " and queryid >= " + endid + ")";
字串73.效果評價
該分頁查詢方法對所有資料庫都適用,對應用伺服器、資料庫伺服器、查詢客戶端的cpu和記憶體占用都較低,查詢速度較快,是乙個較為理想的分頁查詢實現方案。經過測試,查詢4百萬條資料,可以在3分鐘內顯示出首頁資料,以後每一次翻頁操作基本在2秒以內。記憶體和cpu占用無明顯增長。
大資料量資料分頁查詢優化方案
在實際場景中會遇到這樣的一種情況 資料量很大,而且還要分頁查詢,如果資料量達到百萬級別之後,效能會急劇下降,導致查詢時間很長,甚至是超時。接下來我總結了兩種常用的優化方案,僅供參考。但是需要注意的是有個前提 主鍵id是遞增且資料有序。1 使用子查詢優化 這種方式先定位偏移位置的 id,然後往後查詢,...
mysql大資料量分頁查詢優化
參考文章 mysql的分頁查詢十分簡單,但是當資料量大的時候一般的分頁就吃不消了。傳統分頁查詢 select c1,c2,cn from table limit n,m mysql的limit工作原理就是先讀取前面n條記錄,然後拋棄前n條,讀後面m條想要的,所以n越大,偏移量越大,效能就越差。1 盡...
mysql大資料量分頁查詢優化
參考文章 mysql的分頁查詢十分簡單,但是當資料量大的時候一般的分頁就吃不消了。傳統分頁查詢 select c1,c2,cn from table limit n,m mysql的limit工作原理就是先讀取前面n條記錄,然後拋棄前n條,讀後面m條想要的,所以n越大,偏移量越大,效能就越差。1 盡...