V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Graves
V2EX  ›  Java

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

  •  
  •   Graves · 224 天前 · 1297 次点击
    这是一个创建于 224 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如说有个 order 表拿 userid 进行分表分了 128 个表,然后代码层面去关联查询,在知道 order_id 得情况下,select xx from order where id = {order_id} ,框架是 springboot 集成 shardingjdbc 去查询,会扫描 128 个表,即使中间在某张表找到了结果也没有返回,每次都会查询完整 128 个表,这块大家有遇到过吗,不知道是不是我 shardingjdbc 配置的问题,如何做到根据 id 查询到结果就 return 呢?
    14 条回复    2022-03-15 17:39:03 +08:00
    brezp
        1
    brezp  
       224 天前
    等一个回复
    ChovyChu
        2
    ChovyChu  
       224 天前
    没用过 shardingjdbc ,但是从你的描述看,我怎么觉得挺正常的,shardingjdbc 他也不知道是不是只有一条符合条件的数据,所以查完所有表不是正常的吗?可以考虑 limit 1 试试?只是瞎扯扯
    xiao109
        3
    xiao109  
       224 天前   ❤️ 1
    你是拿 userid 分的表,但是查是根据 order_id 。当然要把所有的表都走一遍
    brezp
        4
    brezp  
       224 天前
    查询条件带上你的分片字段, 才能指定查某一个分片
    james2013
        5
    james2013  
       224 天前
    userid 分片字段必须存在并且放在第 1 个位置,才能只查特定的 1 个表
    select xx from order where userid={userId} and id = {order_id}
    issakchill
        6
    issakchill  
       224 天前
    应该是无解的,查询非分片字段,就是要所有表走一遍
    cheng6563
        7
    cheng6563  
       224 天前
    limit 1 应该就查到结果就立即 return 了
    mcfog
        8
    mcfog  
       224 天前
    假设支持你说的功能,那么这个查询就必须串行进行,单次查询的时延 99 线放大 128 倍,平均值放大 64 倍
    agzou
        9
    agzou  
       224 天前
    分区 key 是 userid ,你用 order_id 去查,肯定是全表扫,并没有命中分区
    mango88
        10
    mango88  
       224 天前
    缺少分片 key ,当然是扫全表了...
    Chinsung
        11
    Chinsung  
       224 天前
    不带分片 key ,当然扫全表了。
    要么先查出来分片 key ,用分片 key 挨个查。
    要么再搞个数仓,去数仓查
    要么异构索引表
    Graves
        12
    Graves  
    OP
       222 天前
    @ChovyChu @cheng6563 测试了一下,加了 limit1 没有效果
    @xiao109 @brezp @james2013 @issakchill @agzou @mango88 @Chinsung 确实加了分片的 id 就会扫其中一个表的数据,order_id 用 snowflake 做了分布式 id ,在所有分表中是唯一的,扫全表我能理解,我感觉 sharding 是不是可以加个可配置项,在扫的过程中找到了就 return 不再继续去扫了,还是说我分片的姿势不对,应该拿 order_id 去做分片比较合理。
    @mcfog 不太理解你的意思,我需求就是 order_id 是唯一的,扫表找到了就返回结果,然后不要再继续剩下的表。
    agzou
        13
    agzou  
       220 天前
    @Graves #12 看查询场景吧,一般分片的 key 都是必带的查询条件,要不所有表都会查一次。
    slomo
        14
    slomo  
       204 天前
    如果有资源那就再冗余一份数据用 orderId 分片 = =
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2094 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 57ms · UTC 04:15 · PVG 12:15 · LAX 21:15 · JFK 00:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.