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

2021-06-13 22:18:03 +08:00
 awanganddong

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

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

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

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

因为我怀疑表的涉及有问题,导致无法顺畅实现业务。
zvcs
2021-06-14 08:00:45 +08:00
维护多条件外键表
qiayue
2021-06-14 08:20:29 +08:00
这种场景,用缓存最合适
拆分成 N 次查询,每次先从缓存中查询是否存在,缓存中没有,才从数据库查询
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 性能太差了,被上面两个秒杀,没有用过
awanganddong
2021-06-14 16:27:01 +08:00
@qisyue 现在做了基于 aop 的缓存。
你说的这种缓存,可以考虑。
应该是变动不大的技术方案。
其实耗时最近的是那个连表查询。
但是现在还没办法引入 es 来进行替换。

es 的话,我要建立一套数据同步机制,这个专门维护的话,增加项目复杂度。现在还不太愿意用。
ajaxfunction
2021-06-14 16:58:28 +08:00
以前老想一次性查,结果性能捉急,
后来干脆就多查几次,完美解决。
dk7952638
2021-06-14 19:53:59 +08:00
json_object json_arrayagg 这俩函数就行
json_arrayagg 低版本没有的话用 json_array 也行

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/783246

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX