select * from t order by time offset x limit y 的跨m個庫分頁。
每個庫都必須返回 x+y 個資料,所得到的 m*(x+y) 在服務層進行記憶體排序,然後再取總的偏移量x後的y條記錄。
獲取第一頁的方式和全域性策略是一樣的,但獲取第n頁(n>1)時,我們取 n-1 頁的最大time,即time_max, 對於每個分庫執行 select * from t order by time where time > time_max limit y,這樣在服務層再總排序取前y條記錄。
數學原理:對於乙個有序序列分成 m 個長度不等的有序子串行,m個有序子串行中每個有序子串行前x個元素中的最大值集中起來,再取其中最小值,則該最小值一定小於等於原來有序序列的第 m*x 個元素值。
假設該最小值大於原序列的第 mx 個元素值,那麼m個有序子串行後面第x+個元素值都大於原序列的第 mx 個元素值,即構成原序列前mx 個元素只能是m個有序子串行的前x-個元素,因為mx- < m*x,所以假設不成立。
步驟:
改寫分庫sql為: select * from t order by time offset ceil(x/m) limit y
獲取所有分庫sql中返回的最小time中的最小time,即time_min(詳見上面原理)
改寫分庫sql為:select * from t order by time between time_min and 各自分庫的最大time(從第1步中得到)
第3步的各個分庫的返回結果比第一步多,當然time_min的那個分庫的返回結果肯定不變(所以time_min的那個分庫的sql在實現時可以不用執行)。假設所有分庫總共多出 k 條資料,則全域性_offset = ceil(x/m) * m - k 。(詳見上面原理)
將第3步返回的結果集合並,即第一條資料就是time_min的那條,其_offset由第四步已經得到;我們直接在該結果集的中從第(原始sql的offset - _offset + 2)條資料開始獲取y條資料。
SQLServer跨庫查詢 分布式查詢
用openrowset連線遠端sql或插入資料 如果只是臨時訪問,可以直接用openrowset 查詢示例 select from openrowset sqloledb sql伺服器名 使用者名稱 密碼 資料庫名.dbo.表名 在跨庫查詢時需要啟用ad hoc distributed querie...
分布式 分布式鎖
本質是利用redis的setnx 方法的特性來加鎖,setnx 即key不存在則設定key,否則直接返回false,要求在分布式系統中使用同乙個redis服務,以下提供兩種解決方案 1 直接使用redistemplate 這其實並不能完全保證高併發下的安全問題,因為可能在鎖過期之後該執行緒尚未執行完...
分布式 分布式事務
是資料庫執行過程中的乙個邏輯單位,由乙個有限的資料庫操作序列構成。事務的acid四大特性 原子性 atomicity 事務作為乙個整體被執行。一致性 consistency 從乙個一致的狀態轉換到另乙個一致的狀態。隔離性 isolation 多個事務併發執行時,併發事務之間互相影響的程度。永續性 d...