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

数据量大查询效率优化的疑惑

  •  
  •   cobbage · 1 天前 · 804 次点击

    select * from a left join c left join b on a.bcode=b.code where b.xxid in(1,2,3);

    a 表数据量比较大,实际数据有三张大表这样 union all

    我是这样优化的(因为前端传的是 xxid,我吧 xxid 先转 bcode 查出来直接塞到条件里 效率确实提高了。)

    select * from a left join c left join b on a.bcode=b.code where a.bcode in(11,22,33);

    b 表的量在 1k 多有( code xxid 都建了索引的),a 表百万到千万;

    查询内容不变为什么这样优化后数据效率会提高

    7 条回复    2024-12-18 19:45:30 +08:00
    sagaxu
        1
    sagaxu  
       1 天前
    看实际执行计划 EXPLAIN ANALYZE ,对比两者区别。

    DB 查询优化器,一般基于统计数据做预估,经常失真选择错误的执行路径或者选错索引。
    orioleq
        2
    orioleq  
       17 小时 32 分钟前 via iPhone
    这不显而易见的结果么,先直接过滤最大的表数据获得一个相对小的数据集再跟别的小表做关联,内存上使用都要小很多
    netnr
        3
    netnr  
       17 小时 16 分钟前
    浅析,不考虑优化器,a 表 未过滤进行 join 产生中间表很大,先过滤再 join 就仅仅是你要的三条数据,
    减少了 (a 表数据量减 3) 的无用功 join
    MeiJM
        4
    MeiJM  
       15 小时 20 分钟前   ❤️ 1
    解析顺序是从 form 的表开始,所以 form 的表数据量会影响查询效率
    ilucio
        5
    ilucio  
       6 小时 0 分钟前
    这么理解比较好
    ilucio
        6
    ilucio  
       5 小时 58 分钟前
    select * from ( select * from a where bcode in (11,22,33)) t left join c left join b on t.bcode=b.code
    这样表的数据就小很多了
    PopRain
        7
    PopRain  
       5 小时 35 分钟前
    @MeiJM 解析顺序并不等于执行顺序,再说,这个“解析”要看你怎么理解了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1422 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 17:21 · PVG 01:21 · LAX 09:21 · JFK 12:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.