shardingjdbc 根据 id 查询扫了所有分表

2022-02-23 16:08:07 +08:00
 Graves
比如说有个 order 表拿 userid 进行分表分了 128 个表,然后代码层面去关联查询,在知道 order_id 得情况下,select xx from order where id = {order_id} ,框架是 springboot 集成 shardingjdbc 去查询,会扫描 128 个表,即使中间在某张表找到了结果也没有返回,每次都会查询完整 128 个表,这块大家有遇到过吗,不知道是不是我 shardingjdbc 配置的问题,如何做到根据 id 查询到结果就 return 呢?
1943 次点击
所在节点    Java
14 条回复
brezp
2022-02-23 16:55:35 +08:00
等一个回复
ChovyChu
2022-02-23 16:58:51 +08:00
没用过 shardingjdbc ,但是从你的描述看,我怎么觉得挺正常的,shardingjdbc 他也不知道是不是只有一条符合条件的数据,所以查完所有表不是正常的吗?可以考虑 limit 1 试试?只是瞎扯扯
xiao109
2022-02-23 17:00:31 +08:00
你是拿 userid 分的表,但是查是根据 order_id 。当然要把所有的表都走一遍
brezp
2022-02-23 17:02:08 +08:00
查询条件带上你的分片字段, 才能指定查某一个分片
james2013
2022-02-23 17:30:35 +08:00
userid 分片字段必须存在并且放在第 1 个位置,才能只查特定的 1 个表
select xx from order where userid={userId} and id = {order_id}
issakchill
2022-02-23 17:33:09 +08:00
应该是无解的,查询非分片字段,就是要所有表走一遍
cheng6563
2022-02-23 17:33:10 +08:00
limit 1 应该就查到结果就立即 return 了
mcfog
2022-02-23 18:29:14 +08:00
假设支持你说的功能,那么这个查询就必须串行进行,单次查询的时延 99 线放大 128 倍,平均值放大 64 倍
agzou
2022-02-24 08:41:43 +08:00
分区 key 是 userid ,你用 order_id 去查,肯定是全表扫,并没有命中分区
mango88
2022-02-24 10:15:52 +08:00
缺少分片 key ,当然是扫全表了...
Chinsung
2022-02-24 11:43:20 +08:00
不带分片 key ,当然扫全表了。
要么先查出来分片 key ,用分片 key 挨个查。
要么再搞个数仓,去数仓查
要么异构索引表
Graves
2022-02-25 17:56:45 +08:00
@ChovyChu @cheng6563 测试了一下,加了 limit1 没有效果
@xiao109 @brezp @james2013 @issakchill @agzou @mango88 @Chinsung 确实加了分片的 id 就会扫其中一个表的数据,order_id 用 snowflake 做了分布式 id ,在所有分表中是唯一的,扫全表我能理解,我感觉 sharding 是不是可以加个可配置项,在扫的过程中找到了就 return 不再继续去扫了,还是说我分片的姿势不对,应该拿 order_id 去做分片比较合理。
@mcfog 不太理解你的意思,我需求就是 order_id 是唯一的,扫表找到了就返回结果,然后不要再继续剩下的表。
agzou
2022-02-28 08:51:08 +08:00
@Graves #12 看查询场景吧,一般分片的 key 都是必带的查询条件,要不所有表都会查一次。
slomo
2022-03-15 17:39:03 +08:00
如果有资源那就再冗余一份数据用 orderId 分片 = =

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/835950

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX