水平分庫分表后的分頁查詢解決方案


例如按id取模進行水平分表分n張表,分頁查詢第page頁的rows條數據,當前頁最后一條記錄是索引:currIndex = (page-1)*rows;以下為按id進行排序分頁進行示例說明

主流的有4種解決方案(未經驗證,僅作個人筆記):

額外保存一張表,存儲所有庫所有表的全部id屬性;

分頁查詢時直接從該表查出主鍵,然后再根據主鍵去各個庫、表中查詢具體信息

分別查詢出各個表中的前(page-1)* rows條數據

即:limit 0, (page-1)*rows:該方案在前幾頁查詢還行,當查詢頁數靠后數據量很大時基本是需要取出所有分表中的所有數據,然后利用程序進行分頁,這時因數據量過大而無法處理,只能限制查詢的頁數

限制用戶只能通過上一頁、下一頁進行查詢,不能跳頁

該方案是從第一頁開始查詢:從各個表中取得前rows條數據,然后進行翻頁到下一頁時將本頁的最后一條id作為參數,查詢id>上一頁最大值然后再取rows條數據然后從n*rows條數據中進行篩選

兩輪SQL查詢+內存排序
  1. 首先將需要查詢的總記錄的索引按表均分:start = currIndex/n;然后從各個表中查詢從start開始的rows條數據:limit start, rows,一共查詢出n*rows條數據;
  2. 找出第一步查詢出的數據的最小值:min;然后用min對其他庫、表進行二次查詢補足第一次查詢的數據遺漏:between min and dbMin;(dbMin為第一次查詢各個庫的最小值);
  3. 此時還要查詢最小值所在庫從它到其他庫的最小值(選用其他庫最小值中最大的那個)的數據;(該操作是防止最小值所在庫第一次查詢的10條數據到其他庫第二次查詢的數據(當前庫中大於min的部分)之間存在斷層,數據不連續)
  4. 由以上查詢可以確定最小值min在全局中的位置,從而可以定位需要查詢的數據的位置

在復雜查詢條件下針對第四種方案的疑問

  1. 按已知查詢方案可以確定查詢結果在第二次返回數據中,關鍵問題是如何定位出真正所需要的那rows條數據?

可以在內存中通過各個庫中第一次查詢的數據的位置確定min在全局中的偏移量offset,由偏移量重新定位真正要查詢的數據

  1. 數據在極端的分布(例如某個庫從min值到第一次查詢的值直接有大量數據,當然這個數據量不會超過第一次查詢跳過的數量)情況下,查詢會不會有問題?

有待進一步驗證

  1. 存在查詢條件時,是否仍然可用?

每次查詢數據庫攜帶查詢條件進行查詢而已,方案仍可用

每種解決方案適用於不同的分表策略,具體使用方案應結合分表策略處理


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM