shardingsphere分表之后, 不分表与分表逻辑表的join问题
用shardingsphere分表设计,如果一个表分片,另外一个表不分片,但需求人员的需求是需要用不分片的这个表去 join 分片的逻辑表。这个时候很可能出问题。假设用户表采用分片方式,分做了 10 个分表, 逻辑表为 t_user, 而黑名单不分表,假设为t_black_user, 黑名单是导入进来的,而且需求说了,黑名单导入不做校验。但在查询黑名单的时候,需要根据电话号码去关联t_user表,在列表中展示用户的一些基本信息。
按照通常的做法,采用如下SQL:
select a.字段, b.字段... from t_black_user a left join t_user b on a.tel=b.tel ...
如果这么做,会产生10倍的数据量,因为shardingsphere会采用 t_black_user 分别与 t_user_1, t_user_2.... t_user_10 去left join 查询,然后合并结果,这显然是错的。
那么可能又会这么想,不用left join, 用 inner join.
select a.字段, b.字段... from t_black_user a inner join t_user b on a.tel=b.tel ...
那么新的问题又来了,这种查询是必须两个表中都有的数据才能查询出来,必须是交集数据。但需求说了,导入的数据,可能是用户表中没有的。但也要看到。所以这种做法也不满足需求。
万般无赖之下,在开发中也用同样的分片方式, 将t_black_user 也拆封成10个分表,然后配置绑定表方式,再用left join 方式,反而得到了正确的结果。不知道还有什么其它好办法...
分库分表本来是个好东西,就怕滥用,而且也怕需求瞎搞,一旦需求搞出很多无脑的需求,怎么分表都无法解决。我的建议是搞一个数据仓库,把数据抽取到数据仓库中,作为OLAP库,然后在这个上面进行数据分析处理,当然也可以用定时任务等方式,把数据处理到OLAP上。 但这边一根筋,条件不支持,暂时也不能做。以后在看吧。
From:一号门
Previous:js, canvas实现冬奥会立春效果图
Next:广电网络电话192段号码申请
COMMENTS