公众号merlinsea
背景
在项目中的同一个数据库中存在这样的表,product_order_0商品表,product_order_item_0商品明细表,product_order_1商品表, product_order_item_1商品明细表,其中product_order_0中记录的明细都放在product_order_item_0中,product_order_1中记录的明细都放在product_order_item_1中。这样在做商品表left join商品明细表的关联查询的时候不需要全部遍历,避免发出无效的 sql,这种关系就是绑定表。
绑定表其作用是在关联查询的时候。
准备工作:
在数据库中建立好product_order_0商品表,product_order_1商品表,product_order_item_0商品明细表,product_order_item_1商品明细表
1、在application.properties中新增配置
绑定表的配置会将分片规则结果相同的表绑定在一起。
比如:product_order表的分片规则是id % 2 , product_order_item表的分片规则是product_order_id % 2 ,因此product_order_0会对应上product_order_item_0, product_order_1会对应上product_order_item_1
#配置【默认分库策略】,根据user_id进行分库,因为之前的分库策略都具体到了某张表上 spring.shardingsphere.sharding.default-database-strategy.inline.sharding-column=user_id spring.shardingsphere.sharding.default-database-strategy.inline.algorithm-expression=ds$->{user_id % 2 } #指定product_order表的真实节点 spring.shardingsphere.sharding.tables.product_order.actual-data-nodes=ds$->{0..1}.product_order_$->{0..1} # 指定product_order表的分片策略,分片策略包括【分片键和分片算法】 spring.shardingsphere.sharding.tables.product_order.table-strategy.inline.sharding-column=id spring.shardingsphere.sharding.tables.product_order.table-strategy.inline.algorithm-expression=product_order_$->{id % 2} #指定product_order_item逻辑表的真实节点 spring.shardingsphere.sharding.tables.product_order_item.actual-data-nodes=ds$->{0..1}.product_order_item_$->{0..1} # 指定product_order_item表的分表策略,分片策略包括【分片键和分片算法】 spring.shardingsphere.sharding.tables.product_order_item.table-strategy.inline.sharding-column=product_order_id spring.shardingsphere.sharding.tables.product_order_item.table-strategy.inline.algorithm-expression=product_order_item_$->{product_order_id % 2} #配置绑定表,可以配置多个,会将分片规则一致的表绑定在一起 spring.shardingsphere.sharding.binding‐tables[0] = product_order,product_order_item
关联查询的sql语句
public interface ProductOrderMapper extends BaseMapper<ProductOrderDO> { @Select("select * from product_order o left join product_order_item i on o.id=i.product_order_id") List<Object> listProductOrderDetail(); }
说明点:
分库分表了以后,对于增删改查操作,会尽可能缩小范围,如果sql语句中的条件涉及了分片键,那么sharding jdbc会将这条sql路由到可能出现的表中执行,如果sql语句中没有涉及分片键,那么sharding jdbc会将sql路由到所有的表中执行。因此如果项目中使用到了分库分表,那么在后期编写sql的时候尽可能使用上带分片键的sql语句,避免没有必要的sql开销。
关于leetcode算法训练营:
加我微信号私聊参加训练营,尤其是想进入大厂工作的同学,算法是绕不过去的坎,我自己花了三年时间刷算法,总结思路,刷各种数据结构课程,加入我的训练营,我手把手以在线直播课的形式带你理思路,手把手带你写代码,让你真正体会算法之美~,同时遇到不明白的地方可以直接课上和我沟通,彻底解决你的代码困难症~
本人用c++刷了800道左右的算法,java语言刷了600道左右的算法题,并对这些题做了详细的个人总结。本科期间系统学习了数据结构与算法课程,同时考研过程中写完了率辉主编的《2020年数据结构高分笔记》和《数据结构1000题》,看完的视频包括《mooc浙大数据结构国家精品课程》和《王道考研408数据结构课程》,《王道2019年算法题讲解视频》,最终以初试专业第三名进入了北理工软件工程专业。熟悉并掌握常见的数据结构,比如链表、数组、树、图、队列、堆栈等等,精通数据结构教材中的所有算法,比如常见的遍历算法、动态规划,递归,回溯,剪枝,并查集,最短路径,拓扑排序等,所以快加入训练营吧,我们一起进步
奔跑的小梁,公众号:梁霖编程工具库我决定了,算法文档开源!!