分库分表第三篇之默认数据源
默认数据源
有些情况下,我们某些表并不需要进行分表分库,如果没有进行配置的话,那么就会报错,这时候应该怎么办呢?
默认数据源就是在为解决这种情况而产生的
一、只有部分数据库分库分表,是否需要将不分库分表的表也配置在分片规则中?我们有些表如果不需要进行分库分表的话,比如配置表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。简单的说就是两个集合相乘的结果。
当A表和B关联的时候,就会产生笛卡尔积,什么意思呢?这里我们举例说明:
image.png假设分片键order_id将数值10路由至第0片,将数值11路由至第1片,那么路由后的SQL应该为4条,它们呈现为笛卡尔积:
image.png笛卡尔积的产生,会是的查询效率急速下降,那么怎么解决呢?
通过绑定表。
绑定表:指分片规则一致的主表和子表。
例如:t_order表和t_order_item表,均按照订单ID分片,则此两张表互为绑定表关系。绑定表之间的多表关联查询不会出现笛卡尔积关联,关联查询效率将大大提升。
那么配置了绑定表关系之后,上面的路由SQL应该为2条:
image.png
市面上的项目,不推荐使用多表关联查询!