如果是单条件查询直接 select * from test where a in (1,2,3) 然后通过代码组合就可以了
但是如果是多个查询条件怎么处理呢 select * from test where a=1 and b=2 and c=3 那个循环的变量值都不一样
大家怎么处理这种 N+1 的查询
1
mringg 2021-06-13 22:39:38 +08:00
我居然没看懂 🤦♂️
|
2
awanganddong OP 比如现在查用户列表,然后有一个字段是通过循环查获取到的,现在怎么把这个字段改成只查数据库一次。
查询条件是多项组合的。 |
3
grittiness 2021-06-13 23:00:02 +08:00
如果要只执行一次,感觉可以写存储过程。不过多次执行性能也影响不大吧
|
4
guisheng 2021-06-13 23:09:51 +08:00 via iPhone
数据量大的话用 es 是不是可以呢?不知道我理解的对不对。动态拼接多个参数不确定参数的个数以及复杂度。
|
5
awanganddong OP 现在这个接口属于 left join 3 张表然后再查询,所以正在想办法,一点点优化
|
6
raaaaaar 2021-06-13 23:31:04 +08:00 via Android
一张表就加索引,多张表怎么优化都有下界,查询频率很高的话,考虑建张冗余表如何
|
7
crclz 2021-06-14 00:53:58 +08:00
您好,能给一个 minimal working example 吗?例如,将那 3 张表的字段都列出来,方便大家分析。
因为我怀疑表的涉及有问题,导致无法顺畅实现业务。 |
8
zvcs 2021-06-14 08:00:45 +08:00 via iPhone
维护多条件外键表
|
9
qiayue 2021-06-14 08:20:29 +08:00
这种场景,用缓存最合适
拆分成 N 次查询,每次先从缓存中查询是否存在,缓存中没有,才从数据库查询 |
10
PopRain 2021-06-14 15:54:28 +08:00
SQL SERVER : OUTER APPLY POSTGRESQL: LEFT JOIN LATERAL, 估计是你需要的,可以在子查询中引用左边表的字段做比较,在加上 top 1 order by (pg: order by limit 1) 选出需要的一条
MySql 不了解,多表 join 性能太差了,被上面两个秒杀,没有用过 |
11
awanganddong OP @qisyue 现在做了基于 aop 的缓存。
你说的这种缓存,可以考虑。 应该是变动不大的技术方案。 其实耗时最近的是那个连表查询。 但是现在还没办法引入 es 来进行替换。 es 的话,我要建立一套数据同步机制,这个专门维护的话,增加项目复杂度。现在还不太愿意用。 |
12
ajaxfunction 2021-06-14 16:58:28 +08:00
以前老想一次性查,结果性能捉急,
后来干脆就多查几次,完美解决。 |
13
dk7952638 2021-06-14 19:53:59 +08:00
json_object json_arrayagg 这俩函数就行
json_arrayagg 低版本没有的话用 json_array 也行 |