分库分表第三篇之默认数据源

2020-05-27  本文已影响0人  小螺丝钉cici
默认数据源

有些情况下,我们某些表并不需要进行分表分库,如果没有进行配置的话,那么就会报错,这时候应该怎么办呢?
默认数据源就是在为解决这种情况而产生的

一、只有部分数据库分库分表,是否需要将不分库分表的表也配置在分片规则中?我们有些表如果不需要进行分库分表的话,比如配置表config,那么是否需要进行配置呢?
先看下官方的回答:
是的。因为Sharding-JDBC是将多个数据源合并为一个统一的逻辑数据源。因此即使不分库分表的部分,不配置分片规则Sharding-JDBC即无法精确的断定应该路由至哪个数据源。 但是Sharding-JDBC提供了两种变通的方式,有助于简化配置。

  shardingsphere:
    datasource:
      names: xytparcel,xytexpress0
      xytparcel:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        username: root
        password: root
        jdbc-url: jdbc:mysql://39.100.39.79:30002/xyt_parcel?characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&useTimezone=true&serverTimezone=GMT%2B8
      xytexpress0:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        username: root
        password: root
        jdbc-url: jdbc:mysql://39.100.39.79:30002/xyt_express0?characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&useTimezone=true&serverTimezone=GMT%2B8
    props:
      sql:
        show: true
    sharding:
      tables:
        parcel_info:
          actual-data-nodes: xytparcel.parcel_info$->{0..2}
          table-strategy:
            inline:
              sharding-column: supplier_tenant_id
              algorithm-expression: parcel_info$->{supplier_tenant_id % 3}
        parcel_details:
          actual-data-nodes: xytparcel.parcel_details$->{0..2}
          table-strategy:
            inline:
              sharding-column: supplier_tenant_id
              algorithm-expression: parcel_details$->{supplier_tenant_id % 3}
        express_order:
          actual-data-nodes: xytparcel.express_order$->{0..2}
          table-strategy:
            inline:
              sharding-column: tenant_id
              algorithm-expression: express_order$->{tenant_id % 3}
        print_record:
          actual-data-nodes: xytparcel.print_record$->{0..2}
          table-strategy:
            inline:
              sharding-column: tenant_id
              algorithm-expression: print_record$->{tenant_id % 3}
        pick_bill:
          actual-data-nodes: xytparcel.pick_bill
        pick_bill_parcel:
          actual-data-nodes: xytparcel.pick_bill_parcel
        bind:
          actual-data-nodes: xytexpress0.bind
        template:
          actual-data-nodes: xytexpress0.template
        sender:
          actual-data-nodes: xytexpress0.sender

笛卡尔积和绑定表

当多表关联查询的时候,如果没有进行处理,就会产生笛卡尔积关联,关联查询效率就会比较低,那么怎么解决多表关联查询的笛卡尔积问题呐,就是通过绑定表

image.png

当A表和B关联的时候,就会产生笛卡尔积,什么意思呢?这里我们举例说明:

image.png

假设分片键order_id将数值10路由至第0片,将数值11路由至第1片,那么路由后的SQL应该为4条,它们呈现为笛卡尔积:

image.png

笛卡尔积的产生,会是的查询效率急速下降,那么怎么解决呢?
通过绑定表。
绑定表:指分片规则一致的主表和子表。
例如:t_order表和t_order_item表,均按照订单ID分片,则此两张表互为绑定表关系。绑定表之间的多表关联查询不会出现笛卡尔积关联,关联查询效率将大大提升。
那么配置了绑定表关系之后,上面的路由SQL应该为2条:


image.png

市面上的项目,不推荐使用多表关联查询!

上一篇下一篇

猜你喜欢

热点阅读