【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
原文地址:https://www.cnblogs.com/july-sunny/p/13733952.html