本文介紹路由演算法配置的格式,及如何為邏輯表配置路由演算法。
背景資訊
路由演算法是減少路由時開銷的一種演算法,邏輯表配置了路由演算法後,帶路由欄位則可以快速查詢指定物理表,免去人為計算、切換物理庫表的操作。
路由演算法的更多資訊,請參見路由演算法。
使用情境
- 分表資料查詢
- 分表資料變更
- 分表資料匯出
配置說明
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