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

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

  •  
  •   Graves · 2022-02-23 16:08:07 +08:00 · 2188 次点击
    这是一个创建于 986 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如说有个 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  
       2022-02-23 16:55:35 +08:00
    等一个回复
    ChovyChu
        2
    ChovyChu  
       2022-02-23 16:58:51 +08:00
    没用过 shardingjdbc ,但是从你的描述看,我怎么觉得挺正常的,shardingjdbc 他也不知道是不是只有一条符合条件的数据,所以查完所有表不是正常的吗?可以考虑 limit 1 试试?只是瞎扯扯
    xiao109
        3
    xiao109  
       2022-02-23 17:00:31 +08:00   ❤️ 1
    你是拿 userid 分的表,但是查是根据 order_id 。当然要把所有的表都走一遍
    brezp
        4
    brezp  
       2022-02-23 17:02:08 +08:00
    查询条件带上你的分片字段, 才能指定查某一个分片
    james2013
        5
    james2013  
       2022-02-23 17:30:35 +08:00
    userid 分片字段必须存在并且放在第 1 个位置,才能只查特定的 1 个表
    select xx from order where userid={userId} and id = {order_id}
    issakchill
        6
    issakchill  
       2022-02-23 17:33:09 +08:00
    应该是无解的,查询非分片字段,就是要所有表走一遍
    cheng6563
        7
    cheng6563  
       2022-02-23 17:33:10 +08:00
    limit 1 应该就查到结果就立即 return 了
    mcfog
        8
    mcfog  
       2022-02-23 18:29:14 +08:00
    假设支持你说的功能,那么这个查询就必须串行进行,单次查询的时延 99 线放大 128 倍,平均值放大 64 倍
    agzou
        9
    agzou  
       2022-02-24 08:41:43 +08:00
    分区 key 是 userid ,你用 order_id 去查,肯定是全表扫,并没有命中分区
    mango88
        10
    mango88  
       2022-02-24 10:15:52 +08:00
    缺少分片 key ,当然是扫全表了...
    Chinsung
        11
    Chinsung  
       2022-02-24 11:43:20 +08:00
    不带分片 key ,当然扫全表了。
    要么先查出来分片 key ,用分片 key 挨个查。
    要么再搞个数仓,去数仓查
    要么异构索引表
    Graves
        12
    Graves  
    OP
       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
        13
    agzou  
       2022-02-28 08:51:08 +08:00
    @Graves #12 看查询场景吧,一般分片的 key 都是必带的查询条件,要不所有表都会查一次。
    slomo
        14
    slomo  
       2022-03-15 17:39:03 +08:00
    如果有资源那就再冗余一份数据用 orderId 分片 = =
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3412 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 11:03 · PVG 19:03 · LAX 03:03 · JFK 06:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.