赞
踩
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次
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。