多条件筛选的情况下,如何优化mysql语句中的大量left join?

发布于 2022-09-11 21:45:51 字数 478 浏览 25 评论 0

要实现的功能:通过用户的特长、兴趣、去过的城市等多条件(可叠加)筛选出相关用户
用户与关联表的关系皆为一对多
描述如下:
clipboard.png

SELECT *
FROM 用户表

LEFT JOIN 用户特长
ON XXX=XXX
LEFT JOIN 用户兴趣
ON XXX=XXX
LEFT JOIN 用户去过的城市
ON XXX=XXX

WHERE 用户特长.特长=AAA
AND 用户兴趣.兴趣=BBB
AND 用户去过的城市.城市=CCC

对于这种情况,如果用left join易实现。
但在数据量较大时,性能会急剧下降。而且不利于日后分库分表,同时一大串sql难维护。
我从网上看到很多说可以在应用层用java/php代码实现join操作,具体要怎么实现,能用这个例子解释一下吗?求解。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

行雁书 2022-09-18 21:45:51

基本就两种,join ,或者如 一楼 所说,通过程序去做多条查询。

一般来说呢,如果数据量大,是建议使用第二种,并且加上适当的缓存,因为你这些东西的更新频率也不是很高,并不是很要求实时性。

合理的利用缓存,减轻数据库的压力,自然效率就上去了

海夕 2022-09-18 21:45:51

我理解这应该是一个产品设计的问题, 不应该因为用户关联了很多数据,就一股脑把所有数据返回到客户端。尤其是移动互联网时代, 一定要考虑当前需要把什么具体数据返回给用户。 如果有必要,可以增加中间表、 统计表。在详细表修改时同时更新中间表(group by 类型的视图)和统计表(count 类型的视图), 在需要时直接查询统计表,而不是用join的方式。在海量数据的前提下, join 只是对小表+大表管用,如果是大表+大表的 join,即便有索引,效率也好不到哪去。

尐偏执 2022-09-18 21:45:51

应该是根据用户ID执行多条查询,然后再对所有查询结果进行合并?

二智少女 2022-09-18 21:45:51

这么多leftjoin明显是不合理的。可以把这个sql分成多个查询,然后用代码去处理将处理结果合并。不知道你有没有用过laravel 框架,laravel中的Eloquent有whereHas这个方法,可以去看下。另外不知道用子查询可不可优化,没具体测试。

select * from 用户表 where 用户id in( select 用户id from 用户特长 where 用户特长.特长=AAA );
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文