Sharding-JDBC分库分表绑定表规则优化使用


Sharding-JDBC分库分表绑定表规则优化使用

springboot配置

# t_order  根据order_id分表
sharding.jdbc.config.sharding.tables.t_order.actual-data-nodes=ds.t_order_$->{0..1}
sharding.jdbc.config.sharding.tables.t_order.table-strategy.inline.sharding-column=order_id
sharding.jdbc.config.sharding.tables.t_order.table-strategy.inline.algorithm-expression=t_order_$->{order_id % 2}
sharding.jdbc.config.sharding.tables.t_order.key-generator-column-name=order_id

# t_order_item 根据order_id字段分表
sharding.jdbc.config.sharding.tables.t_order_item.actual-data-nodes=ds.t_order_item_$->{0..1}
sharding.jdbc.config.sharding.tables.t_order_item.table-strategy.inline.sharding-column=order_id
sharding.jdbc.config.sharding.tables.t_order_item.table-strategy.inline.algorithm-expression=t_order_item_$->{order_id % 2}
sharding.jdbc.config.sharding.tables.t_order_item.key-generator-column-name=order_item_id

#绑定表规则列表
sharding.jdbc.config.sharding.binding-tables[0]=t_order,t_order_item

说明:t_order为主表,t_order_item为子表,分片建都是order_id
执行逻辑sql查询语句:
SELECT
    i.*
FROM
    t_order o,
    t_order_item i
WHERE
    o.order_id = i.order_id
AND o.order_id = 100 

[INFO ] 2018-08-29 13:31:02,724 --main-- [Sharding-Sphere-SQL] Actual SQL: ds ::: 
        SELECT
            i.*
        FROM
            t_order_0 o,
            t_order_item_0 i
        WHERE
            o.order_id = i.order_id
        AND o.order_id = 100 
[INFO ] 2018-08-29 13:31:02,724 --main-- [Sharding-Sphere-SQL] Actual SQL: ds ::: 
        SELECT
            i.*
        FROM
            t_order_1 o,
            t_order_item_1 i
        WHERE
            o.order_id = i.order_id
        AND o.order_id = 100
        
问题:查询2次,分片字段order_id=100未使用到,如果使用到应该值查询1次


解决方法:

执行逻辑sql查询语句:
SELECT
    i.*
FROM
    t_order_item i,t_order o
WHERE
    o.order_id = i.order_id
AND o.order_id = 100 

[INFO ] 2018-08-29 13:31:02,724 --main-- [Sharding-Sphere-SQL] Actual SQL: ds ::: 
SELECT
            i.*
FROM
            t_order_item_0 i

            t_order_0 o
 WHERE
            o.order_id = i.order_id
AND o.order_id = 100 

原因:源码ParsingSQLRouter类的方法tableNames.iterator().next() 获取集合第一个表元素为t_order,可以使用分片键,优化查询为一次,否则不使用分片键生成2个sql查询2次

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值