邏輯表
水平拆分的數據庫(表)的相同邏輯和數據結構表的總稱。
例:訂單數據根據主鍵尾數拆分為10張表,分別是t_order_0到t_order_9,他們的邏輯表名為t_order。
真實表
在分片的數據庫中真實存在的物理表。即上個示例中的t_order_0到t_order_9。
數據節點
數據分片的最小單元。由數據源名稱和數據表組成,例:ds_0.t_order_0。
綁定表
指分片規則一致的主表和子表。例如:t_order表和t_order_item表,均按照order_id分片,則此兩張表互為綁定表關系。
綁定表之間的多表關聯查詢不會出現笛卡爾積關聯,關聯查詢效率將大大提升。舉例說明,如果SQL為:
SELECT i.* FROM t_order o JOIN t_order_item i ON o.order_id=i.order_id WHERE o.order_id in (10, 11);
在不配置綁定表關系時,假設分片鍵order_id將數值10路由至第0片,將數值11路由至第1片,那么路由后的SQL應該為4條,它們呈現為笛卡爾積
SELECT i.* FROM t_order_0 o JOIN t_order_item_0 i ON o.order_id=i.order_id WHERE o.order_id in (10, 11); SELECT i.* FROM t_order_0 o JOIN t_order_item_1 i ON o.order_id=i.order_id WHERE o.order_id in (10, 11); SELECT i.* FROM t_order_1 o JOIN t_order_item_0 i ON o.order_id=i.order_id WHERE o.order_id in (10, 11); SELECT i.* FROM t_order_1 o JOIN t_order_item_1 i ON o.order_id=i.order_id WHERE o.order_id in (10, 11);
在配置綁定表關系后,路由的SQL應該為2條:
SELECT i.* FROM t_order_0 o JOIN t_order_item_0 i ON o.order_id=i.order_id WHERE o.order_id in (10, 11); SELECT i.* FROM t_order_1 o JOIN t_order_item_1 i ON o.order_id=i.order_id WHERE o.order_id in (10, 11);
其中t_order在FROM的最左側,ShardingSphere將會以它作為整個綁定表的主表。 所有路由計算將會只使用主表的策略,那么t_order_item表的分片計算將會使用t_order的條件。故綁定表之間的分區鍵要完全相同。
廣播表
指所有的分片數據源中都存在的表,表結構和表中的數據在每個數據庫中均完全一致。適用於數據量不大且需要與海量數據的表進行關聯查詢的場景,例如:字典表。
邏輯表:
真實表:
數據節點:
以上概念見下面配置的紅色個字體部分;
spring: shardingsphere: #數據源名稱,多數據源以逗號分隔(這個數據源名稱下面會用到) datasource: names: ds-master-0,ds-master-1 #上面配置的數據源名稱ds-master-0,用於指向這個datasource ds-master-0: #數據庫連接池類名稱 type: com.alibaba.druid.pool.DruidDataSource #數據庫驅動類名 driverClassName: com.mysql.jdbc.Driver #數據庫url連接 url: jdbc:mysql://127.0.0.1:33306/ds-master-0?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&useSSL=false&serverTimezone=GMT #數據庫用戶名 username: root #數據庫密碼 password: 123456 #同理-同上面 ds-master-1: type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.jdbc.Driver url: jdbc:mysql://127.0.0.1:33306/ds-master-1?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&useSSL=false&serverTimezone=GMT username: root password: 123456 #由數據源名 + 表名組成,以小數點分隔。多個表以逗號分隔,支持inline表達式。缺省表示使用已知數據源與邏輯表名稱生成數據節點。用於廣播表(即每個庫中都需要一個同樣的表用於關聯查詢,多為字典表)或只分庫不分表且所有庫的表結構完全一致的情況 sharding: tables: t_user: #邏輯表 actual-data-nodes: ds-master-$->{0..1}.t_user_$->{0..4} #數據節點: 數據源名+真真實表名 例如:ds-master-t_user_0 ; #真實表: 例如 t_user_0....t_user_4 ## 指定分庫規則 database-strategy: inline: sharding-column: id #分片算法行表達式(只取最后兩個數字進行分片) algorithm-expression: ds-master-$->{id % 2} ## 指定分表規則 table-strategy: inline: sharding-column: id #分片算法行表達式(只取最后兩個數字進行分片) algorithm-expression: t_user_$->{id % 5} ## 生成分布式主鍵 key-generator: #自增列名稱,缺省表示不使用自增主鍵生成器 column: id #自增列值生成器類型,缺省表示使用默認自增列值生成器。可使用用戶自定義的列值生成器或選擇內置類型:SNOWFLAKE/UUID/LEAF_SEGMENT type: SNOWFLAKE
