多条件筛选的情况下,如何优化mysql语句中的大量left join?
要实现的功能:通过用户的特长、兴趣、去过的城市等多条件(可叠加)筛选出相关用户
用户与关联表的关系皆为一对多
描述如下:
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
基本就两种,join ,或者如 一楼 所说,通过程序去做多条查询。
一般来说呢,如果数据量大,是建议使用第二种,并且加上适当的缓存,因为你这些东西的更新频率也不是很高,并不是很要求实时性。
合理的利用缓存,减轻数据库的压力,自然效率就上去了
我理解这应该是一个产品设计的问题, 不应该因为用户关联了很多数据,就一股脑把所有数据返回到客户端。尤其是移动互联网时代, 一定要考虑当前需要把什么具体数据返回给用户。 如果有必要,可以增加中间表、 统计表。在详细表修改时同时更新中间表(group by 类型的视图)和统计表(count 类型的视图), 在需要时直接查询统计表,而不是用join的方式。在海量数据的前提下, join 只是对小表+大表管用,如果是大表+大表的 join,即便有索引,效率也好不到哪去。
应该是根据用户ID执行多条查询,然后再对所有查询结果进行合并?
这么多leftjoin明显是不合理的。可以把这个sql分成多个查询,然后用代码去处理将处理结果合并。不知道你有没有用过laravel 框架,laravel中的Eloquent有
whereHas
这个方法,可以去看下。另外不知道用子查询可不可优化,没具体测试。