跨庫跨表的分頁查詢實現

2021-07-06 00:21:12 字數 1976 閱讀 6198

對於資料庫分庫分表之後,涉及到查詢時就會存在一些問題,比如如何分頁,如何排序,如何處理函式平均值等等,特別是對於分頁功能,需要在應用中將資料合併後進行排序,在顯示,還需要考慮應用中翻頁的頁碼與實際庫中查詢時頁碼的關係,同時還需要考慮某個庫資料查詢完畢後,其他庫中如何增加每次查詢頁碼的問題,否則查詢後的總頁數不能滿足應用中的頁數。

當前gap平台正在進行組織許可權系統的服務化,存在乙個統一集中式管理的遠端組織許可權服務系統,同時也存在乙個具體業務系統的本地組織許可權,那麼當使用者登陸到本地業務系統後,在進行系統使用者管理時,希望看到的是能登陸到本地系統所有的使用者資訊,此時看到的使用者資料來自遠端(公共管理的使用者資料)和本地(業務系統特有的使用者資料),如何實現分頁?下面結合具體情況說明如何實現。

場景是2個資料庫,要求排序,並且查詢不是非常頻繁,訪問量也不會很大,沒有使用者會一直在那裡進行翻頁操作,同時對於乙個企業來說,使用者資訊頻繁變動也是不切實際的。

對於分頁功能來說,分兩種情況,一種要求排序,一種不要求排序。非排序分頁,可以按照同等步長的方式在2個資料來源上進行分頁查詢,也就是分頁的每頁記錄數,平均來自這2個資料來源,每次查詢每頁的記錄數都平均來自這2個資料來源,當某個資料來源沒有符合條件的資料記錄時,就需要單獨查詢另外乙個資料來源,查詢的記錄數同時也就需要增加;而另外一種情況可以按照同等比例的分頁方式,也就是某個資料來源每次分頁查詢時查詢的記錄數占該資料來源符合條件的所有記錄的比例是一定的,因為每次分頁查詢查多少記錄是根據2個資料來源中所有符合條件的記錄總數計算出來的,這樣就保證了當分頁查詢結束後,2個資料來源也就同時查詢完畢。

那麼非排序分頁的弊端在那裡,首先不能進行排序,這樣資料出來比較亂,使用者不會滿意,其次對於同等比例或者同等步長這兩種方式,需要考慮的因素比較多,如下:

每次分頁如何平均2個資料來源上的查詢記錄數
當每頁記錄數變化時怎麼處理
當某個資料來源查詢完畢,沒有符合條件的記錄時,如何對另乙個資料來源增加每次查詢的記錄數?增加後就會影響到計算起始記錄數
所以我們決定選擇排序分頁方式。就是從2個資料來源處將足夠多的資料取回來,在應用中按照某個條件進行歸併排序,然後進行分頁顯示,難點在於取多少才算是足夠的資料?考慮一種比較極端的情況,就是滿足當前頁的排好序的記錄都來自同乙個資料來源,那麼就要求每次查詢時,每個資料來源的分頁記錄數至少是這個值。比如當前每頁顯示4條記錄,那麼查詢第一頁時,需要每個資料來源至少查出排好序的記錄數4條,也就是總共8條記錄數,然後進行歸併排序,再顯示排好序的4條,另外4條記錄將會被丟掉;當查詢第二頁時,是不是只要查詢每個資料來源中的第二頁資料呢?其實不是這樣的,因為雖然每個資料來源中的分頁資料是已經排好序的,但是你無法確定這2個資料來源中第二頁資料之間的排序情況,有可能其中乙個資料來源的第三頁資料與另外乙個資料來源的第五頁資料才是臨近排序的,所以我們需要取回每個資料來源的前兩頁資料,再進行歸併排序,那麼當使用者直接翻到100頁的時候,就需要把每個資料來源的前100頁所有資料都取出,然後進行排序,而且是每次分頁查詢都需要重新查詢一次上次已經查出的資料。

對於這種方式,我們的改進措施是使用快取,將每次查詢出的記錄都儲存在快取中,當然是已經排好序的。當使用者第一次翻頁時,查詢第一頁資料,實際是從2個資料來源處總共查出4(這個偏移量是可以配置的)頁大小的資料(每個資料來源2頁大小資料),同時應用中排好序後進行快取,這樣這四頁資料全部從快取中載入,速度很快;當翻到第五頁的時候,再做一次查詢(前四頁資料不再重複查詢),按照偏移量大小,將取回來的資料與原來前四頁資料進行重新排好序,然後再次放入快取中,這樣前8頁資料都是從快取中獲取,而且是排好序的。

極端情況是,使用者一下子直接查詢了第100頁的資料,那麼按照偏移量設定,每個資料來源是查詢了200頁的資料,總共是400頁資料被一下子查詢出來,然後進行排序放入快取,對於這種情況,我們做了預防措施,如果跨度過大,比如這裡的100頁翻頁情況,我們直接不予進行查詢。

通過結合快取,保證了排序分頁的實現,同時對每次查詢條件不同,快取的內容不同,所以系統對於相同查詢條件的查詢結果都做了快取,速度提公升明顯。並且當使用者資料有更新時,並沒有及時更新快取,我們提供了乙個重新整理按鈕,強制清除快取,重新查詢,因為快取資料配置的是永不過期策略。

mysql跨庫分頁查詢 跨庫跨表分頁

前言 之前經常思考的乙個問題,資料庫分表後,分頁怎麼做才是最好的方案呢?今天就來整理一波.由來首先是由來,資料量增大,一張表資料太多的話,會使用分表.同理,乙個資料庫例項到達瓶頸,所以可能需要分庫 開始分表分庫都需要乙個依據.一般都安裝主鍵自增id來分割,很多時候分頁都是有時間排序的,這樣分割也能保...

mysql跨庫跨表查詢

簡單記錄 select from dysns.uchome pay record,91feile.phpcms game where uchome pay record.uid phpcms game.touserid select from dysns.uchome pay record,91fe...

Oracle實現跨庫查詢

場景模擬 當前登入的庫是ocrla,然後我的需求是希望直接通過sql能夠查詢到ocrlb庫的資料。oracle在進行跨庫訪問時,可以通過建立dblink實現。第一步 使用者許可權 檢視當前使用者是否擁有database link 許可權 select from user sys privs wher...