唐山豐南建設(shè)局網(wǎng)站b2b平臺是什么意思
分片策略
基本概念
分片鍵
用于分片的字段,是將數(shù)據(jù)庫或表拆分的字段,比如,我可以使用user_id作為分片鍵將用戶數(shù)據(jù)分到不同的表中,這里的user_id就是分片鍵,除了這種單字段分片,ShardingSphere還支持多個分片字段。SQL中如果沒有分片字段,將執(zhí)行全路由,也就是會把SQL發(fā)送到所有的數(shù)據(jù)分片上執(zhí)行,性能較差。
分片算法
分片算法描述的是如何進(jìn)行分片,需要結(jié)合分片鍵使用。比如我需要使用user_id對2取模進(jìn)行分表,那么這里取模就是分片算法,SQL特殊查詢?nèi)?gt;、<、=、IN和Between會出現(xiàn)問題。
問題,如SQL
select * from t_order
有2個庫2個表
db1 -> t_order_1 , t_order_2
db2 -> t_order_1 , t_order_2
以取摸%2算法計算,偶數(shù)id分配在表2,庫2,,奇數(shù)同理,查詢=>8888,10000
由于沒有重寫路由算法,SQL會以全庫全表形式查詢,實際查詢查詢了4個數(shù)據(jù)庫。
分片策略
分片策略是一種抽象的概念,實際分片操作的是由分片算法和分片健來完成的。
真正可?于分?操作的是分?鍵 + 分?算法,也就是分?策略。
分片算法
sharding-jdbc 提供了多種分片算法:
提供了抽象分片算法類:ShardingAlgorithm,根據(jù)類型又分為:精確分片算法、區(qū)間分片算法、復(fù)合分片算法以及Hint分片算法;
- 精確分片算法:對應(yīng)PreciseShardingAlgorithm類,主要用于處理 = 和 IN的分片;
- 區(qū)間分片算法:對應(yīng)RangeShardingAlgorithm類,主要用于處理 BETWEEN AND, >, <, >=, <= 分片;
- 復(fù)合分片算法:對應(yīng)ComplexKeysShardingAlgorithm類,用于處理使用多鍵作為分片鍵進(jìn)行分片的場景;
- Hint分片算法:對應(yīng)HintShardingAlgorithm類,用于處理使用 Hint 行分片的場景;
1、精確分片算法 PreciseShardingAlgorithm
用于單個字段作為分片鍵,SQL中有 = 與 IN 等條件的分片,需要配合 StandardShardingStrategy 使?。
2、范圍分片算法 RangeShardingAlgorithm
范圍分片算法(RangeShardingAlgorithm)用于單個字段作為分片鍵,SQL中有 BETWEEN AND、>、<、>=、<= 等條件的分片,需要需要配合 StandardShardingStrategy 使?。/3、復(fù)合分片算法 ComplexKeysShardingAlgorithm
對應(yīng) ComplexKeysShardingAlgorithm,?于處理使? 多鍵作為分?鍵 進(jìn)?分?的場景,
(多個字段作為分片鍵),同時獲取到多個分片健的值,根據(jù)多個字段處理業(yè)務(wù)邏輯。
包含多個分?鍵的邏輯較復(fù)雜,需要應(yīng)?開發(fā)者??處理其中的復(fù)雜度。
需要配合 ComplexShardingStrategy 使?。
需要在復(fù)合分片策略(ComplexShardingStrategy )下使用。
Hint 分片算法 HintShardingAlgorithm
Hint 分片算法(HintShardingAlgorithm)稍有不同
前面的算法(如StandardShardingAlgorithm)都是解析 SQL 語句, 提取分片值,并根據(jù)設(shè)置的分片算法進(jìn)行分片。
4、Hint 分片算法 指定分?值而?從 SQL 中提取,而是手工設(shè)置的?式,進(jìn)?分?的策略。
對于分?值? SQL 決定,不是來自于分片建,甚至連分片建都沒有 ,而由其他外置條件決定的場景,可使?Hint 分片算法 。
就需要通過 Java API 等方式 指定 分片值,這也叫強制路由、或者說 暗示路由。
例: 內(nèi)部系統(tǒng),按照員?登錄主鍵分庫,而數(shù)據(jù)庫中并?此字段。
SQL Hint ?持通過 Java API 和 SQL 注釋(待實現(xiàn))兩種?式使?。
標(biāo)準(zhǔn)分片策略
標(biāo)準(zhǔn)分片策略的使用場景:SQL 語句中有>,>=, <=,<,=,IN 和 BETWEEN AND 操作符,都可以應(yīng)用此分片策略。
標(biāo)準(zhǔn)分片策略(StandardShardingStrategy),它只支持對單個分片健(字段)為依據(jù)的分庫分表,
并提供了兩種分片算法 PreciseShardingAlgorithm(精準(zhǔn)分片)和 RangeShardingAlgorithm(范圍分片)。
其中,精準(zhǔn)分片算法是必須實現(xiàn)的算法,用于 SQL 含有 = 和 IN 的分片處理;
范圍分片算法是非必選的,用于處理含有 BETWEEN AND 、>,>=, <=,<的分片處理。
RangeShardingAlgorithm 是可選的。
精準(zhǔn)分片用于處理含有= 、in的分片處理。
范圍分片 用于處理含有 BETWEEN AND
、>
,>=
, <=
,<
的分片處理。
**PreciseShardingAlgorithm**接口
處理 = 和 IN 查詢:
其中Collection databaseNames 為分片庫名稱,PreciseShardingValue
為分片屬性,其中 logicTableName
為邏輯表,columnName
分片健(字段),value
為從 SQL 中解析出的分片健的值。分表以上參數(shù)同理。
public class MyDBProcessShardingAlgorithm implements PreciseShardingAlgorithm<Long> {// databaseNames 重寫分庫規(guī)則@Overridepublic String doSharding(Collection<String> databaseNames, PreciseShardingValue<Long> shardingValue) {for (String key : databaseNames) {//TODO}
}// tableNames 重寫分表規(guī)則@Overridepublic String doSharding(Collection<String> tableNames,PreciseShardingValue<Long> shardingValue) {for (String key : tableNames) {//TODO}}
**RangeShardingAlgorithm**接口
使用范圍查詢:
RangeShardingValue
這里取值方式稍有不同, lowerEndpoint
表示起始值, upperEndpoint
表示截止值。
public class MyDBRangeAlgorithm implements RangeShardingAlgorithm<Integer> {@Overridepublic Collection<String> doSharding(Collection<String> databaseNames, RangeShardingValue<Integer> rangeShardingValue) {HashMap<String> result = new HashMap<>();int lower = rangeShardingValue.getValueRange().lowerEndpoint();int upper = rangeShardingValue.getValueRange().upperEndpoint();for (int i = ; i <= upper; i++) {//TODO}return result;}
}