1.关联查询
对逻辑表user_order,user_order_item进行关联查询:
SELECT uo.order_number orderNumber,SUM(uoi.item_price) AS orderPrice
FROM user_order uo
LEFT JOIN user_order_item uoi ON uo.id=uoi.user_order_id
GROUP BY uo.id
user_order分为两个数据源中的4个分片:
ds_0.user_order_0,ds_0.user_order_1,ds_0.user_order_1,ds_1.user_order_1
user_order_item分为两个数据源中的4个分片:
ds_0.user_order_item_0,ds_0.user_order_item_1,ds_0.user_order_item_1,ds_1.user_order_item_1
使用相同的字段作为分库字段,*两个表都使用关联字段作为分表字段。
此时进行关联查询,由于分库策略相同,因此不会跨库查询,此时:
会对ds_0库进行,user_order_0和user_order_item_0,user_order_1和user_order_item_1,user_order_0和user_order_item_1,user_order_1和user_order_item_0,4次关联查询,
会对ds_1库进行,user_order_0和user_order_item_0,user_order_1和user_order_item_1,user_order_0和user_order_item_1,user_order_1和user_order_item_0,4次关联查询,
后合并结果。
由于两个表都使用关联字段作为分表字段,因此两个表中数据所在的分片有固定的对应关系,可通过配置绑定表,减少实际级联查询次数。
2.配置绑定表
shardingsphereconf.yaml中添加:
...
rules:
- !SHARDING
bindingTables:
- user_order,user_order_item
...
此时:
会对ds_0库进行,user_order_0和user_order_item_0,user_order_1和user_order_item_1,2次关联查询,
会对ds_1库进行,user_order_0和user_order_item_0,user_order_1和user_order_item_1,2次关联查询,
后合并结果。
官方文档:
https://shardingsphere.apache.org/document/current/cn/user-manual/shardingsphere-jdbc/yaml-config/rules/sharding/
3.打印sql
shardingsphereconf.yaml中添加:
...
props:
sql-show: true
...
官方文档:
https://shardingsphere.apache.org/document/current/cn/user-manual/common-config/props/
4.参考代码
链接:https://pan.baidu.com/s/1I9wzqOEi0yII1jRz7UEzdA?pwd=1111
提取码:1111
需要用init.sql中语句建表,更换数据库链接和账号密码