AppBoxFuture: 大資料表分割槽的3種策略
之前的文章“分而治之”在介紹大表分割槽時,作者尚未實現不同的分割槽策略,即只能按指定的分割槽鍵進行分割槽。這次作者完善了一下分割槽策略,在規劃大表分割槽時可以按Hash或者時間範圍進行分割槽,所以本篇介紹不同的分割槽策略適用的場景,同時介紹一下表掃描時如何指定從特定分割槽查詢資料。
一、分割槽策略及其適用場景:
在新建實體模型時,根據資料是否動態增長以及預估資料規模後確定合適的分割槽策略,另外根據作者虛擬機器的配置單分割槽的記錄數在100萬內比較合適:
注意:實體成員作為分割槽鍵時是隻讀的,實體儲存後不能修改分割槽鍵。
1. 指定鍵值分割槽
新增分割槽鍵時指定某個實體成員作為分割槽鍵,適用於:
- SaaS類應用按租戶進行資料分割槽;
- 基礎資料如商品按不同型別進行資料分割槽;
- 動態資料如結算單按不同賬期進行資料分割槽。
2. 鍵值Hash分割槽
新增分割槽鍵時指定成員並指定Hash數量作為分割槽鍵,適用於基礎資料需要分割槽,且分割槽的總數可以確定在一定範圍內。
注意:Hash分割槽在查詢資料指定分割槽謂詞時只能進行相等判斷
3. 時間範圍分割槽
新增分割槽鍵時指定時間型別的成員並指定按年、月、日作為分割槽鍵,適用於動態增長的資料按時間範圍進行分割槽,最簡單的例子是訂單按年分割槽儲存。
4. 組合分割槽
可以新增多個分割槽鍵組合分割槽,如SaaS應用按租戶然後按年進行分割槽。
二、如何從指定分割槽查詢資料:
之前實現的TableScan在掃描表資料時,如果是分割槽表會依次掃描各個分割槽,這次作者完善了一下TableScan的實現,在明確知道資料在哪個分割槽或分割槽範圍內時,可以指定分割槽謂詞,從而從指定的表分割槽內掃描資料。示例程式碼如下:
var q = new TableScan<Entities.VehicleState>(); q.Partitions.Equal(t => t.VehicleId, 1); //指定分割槽謂詞1 q.Partitions.Equal(t => t.CreateTime, new DateTime(2019, 6, 29)); //指定分割槽謂詞2 return await q.ToListAsync(); //從指定分割槽掃描資料
注意:目前僅實現謂詞的相等判斷且必須指定全部分割槽鍵謂詞(即目前只能從確定分割槽內掃描),>, >=, <, <=, Between尚未實現。
三、小結:
本篇主要介紹了大表分割槽的策略及其適用場景,Github上的執行時已經更新可測試,如果您有問題或Bug報告,請留言或提交Issue。另外您的關注與點贊將是作者最大的動力,以驅動作者全力以赴完成這個框架