美文网首页
分库分表第三篇之默认数据源

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

作者: 小螺丝钉cici | 来源:发表于2020-05-27 18:09 被阅读0次
    默认数据源

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

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

    • 方法1:配置default-data-source,凡是在默认数据源中的表可以无需配置在分片规则中,Sharding-JDBC将在找不到分片数据源的情况下将表路由至默认数据源。

    • 方法2:将不参与分库分表的数据源独立于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
    
    
    笛卡尔积和绑定表

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

    • 什么是笛卡尔积
      笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尓积(Cartesian product),又称直积,表示为X×Y。简单的说就是两个集合相乘的结果。
    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

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

    相关文章

      网友评论

          本文标题:分库分表第三篇之默认数据源

          本文链接:https://www.haomeiwen.com/subject/lnxgahtx.html