1. 程式人生 > >冷熱數據庫分離思路

冷熱數據庫分離思路

fun ati 日期 註意 tool 分表 使用 value 對比

1、數據庫分庫而不是分表,分表需要考慮後期的查詢問題,此外還需要註意分表的算法(哈希算法)。

2、熱數據只占全部數據的一部分,因此每次優先查詢熱庫,以下情況才查詢冷庫

- 當查詢條件未命中(結果集為空)時,查詢冷庫。
- 當查詢條件部分命中時,查詢冷庫。

3、為了區分部分命中和全部命中,可以在熱庫中建一張R表存放每次查詢冷庫的查詢條件和查詢結果數量和查詢結果的主鍵,每次查詢熱庫時,對比相同查詢條件的查詢結果數量是否一致。一致,則本次查詢結束。不一致,則需要到冷庫中進行查詢。

4、更優方案:不一致的情況,只到冷庫中查詢未查到的數據。此時R表需要存放的不僅是查詢結果數量,還有查詢結果的所有主鍵。

5、舉例說明:100條中80條還是熱數據 20條變成了冷數據,其實應該只是對冷數據庫發起這20條數據的請求。此時需要將R表數據拿出來比對,只查一部分冷數據。

6、熱庫=>冷庫 : 查詢和使用熱數據時,將一段時間不再使用的熱數據移到冷庫。

7、冷庫=>熱庫 :查詢冷庫時,將本次查詢的結果移到熱庫,附上最新查詢日期。

8、數據同步(每次查詢進行或達到一定量級進行)

9、關於命中的處理:制定查詢條件字典 如 where a=? and b=? 這個條件的字典為

  

public static IDictionary<int,int> QueryKeyValues=new IDictionary<int,int>{
 (0,1),(1,2),(3,3)
}

  先進行查詢條件的字典命中處理=> 假設此時的查詢方法為 queryFunction(int a,int b)

  queryFunction(int a,int b) {}

技術分享圖片
public object QueryFunction(int a,int b) {
    
   1.若 <a,b> 存在於 QueryKeyValues中則到R表中找出查詢條件為<a,b>的IdString都有哪些 以此將Id分開存取
   2.獲得IdString後 比對需要到冷庫查詢的List<string> singleId
   3.循環執行單條語句查詢邏輯 SingleColdDBQuery(List<string> singleId)
}
技術分享圖片

冷熱數據庫分離思路