本文介紹路由演算法配置的格式,及如何為邏輯表配置路由演算法。
背景資訊
路由演算法是減少路由時開銷的一種演算法,邏輯表配置了路由演算法後,帶路由欄位則可以快速查詢指定物理表,免去人為計算、切換物理庫表的操作。
路由演算法的更多資訊,請參見路由演算法。
使用情境
- 分表資料查詢
- 分表資料變更
- 分表資料匯出
配置說明
Data Management分表路由演算法採用Groovy運算式方式定義,與應用代碼裡使用配置的路由演算法類似。
運算式格式:#+路由欄位+#。例如#shardKey#。
配置路由演算法
如下操作展示如何配置簡單模數方式的路由演算法。
-
在邏輯庫下配置邏輯表。具體操作,請參見邏輯表。
-
邏輯表配置完成後,您可在全域搜尋網頁面單擊目標邏輯庫右側的查詢,進入SQL視窗頁面。
說明您也可以在頂部功能表列中,選擇。
-
在頁面右上方單擊
,進入表列表頁面。 -
單擊目標邏輯錶行的配置演算法。
-
在演算法列表頁面,單擊新增,配置演算法類型、模數方式、分表欄位和模數。
本樣本中的演算法類型選擇單列模數、模數方式選擇簡單模數,分表欄位選擇id,模數為4,運算式為
#id#%4。說明-
簡單模數只能選中數字類型的欄位進行模數。
-
雜湊模數可選擇數字或者字串類型的欄位進行模數。
-
-
單擊儲存。
-
路由演算法配置完成後,您可在邏輯表中查詢表資料、執行INSERT語句。系統會根據計算的路由結果,將資料插入對應編號的分表中。
例如插入一個ID為9的資料行,其計算的路由結果為1,該資料將會插入logic_table_01分表中。
路由運算式樣本
如下運算式中的user_id為表欄位樣本值。
-
按表規則路由
-
簡單模數
-
數字模數:
#user_id#%100 -
二次模數:
#user_id#%10000%100 -
數字JavaHash模數:
Math.abs(#user_id#.hashCode())%100
-
-
字串模數
-
數字字串hash:
Math.abs(#user_id#.toString().hashCode())%100 -
字串hash:
Math.abs(#user_id#.hashCode())%100 -
CobarHash:
Math.abs(cobarHash(#column#,start, end)).intdiv(8) -
CobarOldHash:
Math.abs(cobarOldHash(#column#, len)).intdiv(8)
-
-
-
按庫規則路由
-
同名庫表規則:
'schema_prefix_'+(#user_id#%10)+'.table_name' -
庫名和表名
-
'schema_prefix_'+(#user_id#%100)+'.table_name_prefix_'+(#user_id#%1000) -
每個分庫內同一套分表:
'schema_prefix_'+lastSwapZero(String.valueOf((#user_id#%1024).intdiv(128),4)+'.table_name_prefix_'+lastSwapZero(String.valueOf((#user_id#%128)),4) -
字串的第16、17位元字除以2路由庫,字串的第16、17位路由表:
'schema_prefix_'+substring(#EXTEND_ID#,16,18).toLong().intdiv(2)+'.table_name_prefix_'+substring(#EXTEND_ID#,16,18)
-
-
-
按日期路由
每月同一天路由到同一個表:
dayOfMonth(#time#) -
按照字串的倒數第三位進行路由
表名步長為10遞增乘以10,若為1則不需要乘:
Integer.valueOf(substring(#ip_id#,-3,-2))*10 -
其它複雜路由
自訂函數方式:
String func(String arg){ return arg.hashCode()%10;} 'table_name_'+func(#user_id#)+'_other_'func(#user_id#)說明-
函數與運算式之間需要設定換行。
-
DMS支援
CRC32(java.util.zip.CRC32)函數路由。
-
內建通用函數
-
cobarOldHash
-
cobarHash
-
weekOfYear
-
dayOfYear
-
dayOfMonth
-
dayOfWeek
-
substring
-
last4swap
-
lastSwapZero