› MySQL 5.5 Community Server
› MySQL 5.6 Community Server
› Percona Configuration Wizard
› XtraBackup 搭建主从复制
Great Sites on MySQL
› Percona
› MySQL Performance Blog
› Severalnines
推荐管理工具
› Sequel Pro
› phpMyAdmin
推荐书目
› MySQL Cookbook
MySQL 相关项目
› MariaDB
› Drizzle
参考文档
› http://mysql-python.sourceforge.net/MySQLdb.html
awanganddong
V2EX  ›  MySQL

mysql n+1 查询大家是怎么处理的

  •  
  •   awanganddong · Jun 13, 2021 · 3896 views
    This topic created in 1944 days ago, the information mentioned may be changed or developed.

    如果是单条件查询直接 select * from test where a in (1,2,3) 然后通过代码组合就可以了

    但是如果是多个查询条件怎么处理呢 select * from test where a=1 and b=2 and c=3 那个循环的变量值都不一样

    大家怎么处理这种 N+1 的查询

    13 replies  •  2021-06-14 19:53:59 +08:00
    ming2050
        1
    ming2050  
       Jun 13, 2021
    我居然没看懂 🤦‍♂️
    awanganddong
        2
    awanganddong  
    OP
       Jun 13, 2021
    比如现在查用户列表,然后有一个字段是通过循环查获取到的,现在怎么把这个字段改成只查数据库一次。
    查询条件是多项组合的。
    grittiness
        3
    grittiness  
       Jun 13, 2021
    如果要只执行一次,感觉可以写存储过程。不过多次执行性能也影响不大吧
    cameco
        4
    cameco  
       Jun 13, 2021 via iPhone
    数据量大的话用 es 是不是可以呢?不知道我理解的对不对。动态拼接多个参数不确定参数的个数以及复杂度。
    awanganddong
        5
    awanganddong  
    OP
       Jun 13, 2021
    现在这个接口属于 left join 3 张表然后再查询,所以正在想办法,一点点优化
    raaaaaar
        6
    raaaaaar  
       Jun 13, 2021 via Android
    一张表就加索引,多张表怎么优化都有下界,查询频率很高的话,考虑建张冗余表如何
    crclz
        7
    crclz  
       Jun 14, 2021
    您好,能给一个 minimal working example 吗?例如,将那 3 张表的字段都列出来,方便大家分析。

    因为我怀疑表的涉及有问题,导致无法顺畅实现业务。
    zvcs
        8
    zvcs  
       Jun 14, 2021 via iPhone
    维护多条件外键表
    qiayue
        9
    qiayue  
       Jun 14, 2021
    这种场景,用缓存最合适
    拆分成 N 次查询,每次先从缓存中查询是否存在,缓存中没有,才从数据库查询
    PopRain
        10
    PopRain  
       Jun 14, 2021
    SQL SERVER : OUTER APPLY POSTGRESQL: LEFT JOIN LATERAL, 估计是你需要的,可以在子查询中引用左边表的字段做比较,在加上 top 1 order by (pg: order by limit 1) 选出需要的一条

    MySql 不了解,多表 join 性能太差了,被上面两个秒杀,没有用过
    awanganddong
        11
    awanganddong  
    OP
       Jun 14, 2021 via Android
    @qisyue 现在做了基于 aop 的缓存。
    你说的这种缓存,可以考虑。
    应该是变动不大的技术方案。
    其实耗时最近的是那个连表查询。
    但是现在还没办法引入 es 来进行替换。

    es 的话,我要建立一套数据同步机制,这个专门维护的话,增加项目复杂度。现在还不太愿意用。
    ajaxfunction
        12
    ajaxfunction  
       Jun 14, 2021
    以前老想一次性查,结果性能捉急,
    后来干脆就多查几次,完美解决。
    dk7952638
        13
    dk7952638  
       Jun 14, 2021
    json_object json_arrayagg 这俩函数就行
    json_arrayagg 低版本没有的话用 json_array 也行
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   3600 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 121ms · UTC 10:27 · PVG 18:27 · LAX 03:27 · JFK 06:27
    ♥ Do have faith in what you're doing.