【ShardingSphere】ShardingSphere學習(二)-核心概念-SQL


邏輯表

  水平拆分的數據庫(表)的相同邏輯和數據結構表的總稱。

  例:訂單數據根據主鍵尾數拆分為10張表,分別是t_order_0t_order_9,他們的邏輯表名為t_order

真實表

  在分片的數據庫中真實存在的物理表。即上個示例中的t_order_0t_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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM