JOIN 与 IN 查询连表选择

本文探讨了在数据库查询中,针对不同数据量使用JOIN和IN的策略。在处理大量数据时推荐使用JOIN,小数据量场景下推荐使用IN。通过一个具体的查询示例,展示了如何在用户领奖记录查询中应用这一策略。虽然在某些情况下,JOIN和IN的性能差距不大,但使用IN可以提高SQL的可控性和稳定性,确保在不同MySQL版本上的性能表现一致。
摘要由CSDN通过智能技术生成

前言

在我们日常的查询业务之中,往往并不是一张表的查询能解决问题。
如何解决不同表的关联问题,我们当前有着不同的方案。
我对于当前的主要看法便是:
关联大量的数据集合使用 JOIN ,关联小量的数据(数据量最多以百为单位,普通古籍在一两百左右) 的集合使用 IN 。
( 至于为什么数据量大的情况下不能使用 IN 呢?我想大家都很清楚了。下文也不对此进行解释)
对于这个观点,大家可能已经理解或者已经熟悉,但是我还是按照一个实际的需求来表达清楚当前的事情。

实际问题

当前存在关系 , 活动计划表(campaign) , 活动奖品表(award) , 用户表(user) , 用户领取奖品表(user_award)
现在我们需要查询用户的领奖记录,每次查询出来十条 。
查询出来的信息包括 :
参加活动计划名称(campaign_name 位于 campaign)
活动奖品名称 (award_name 位于 award_name )
用户名称(user_name , 位于 user)
我们不单单,需要这三个信息作为查询结果,也需要这三个信息作为查询条件。
并且需要按照 领取时间(release_time) 来进行倒序

如果我们想用一条SQL解决所有问题,我们的SQL便会是如此(使用mybatis,写法来表示SQL的多变性:

<select id="xxx">
SELECT * FROM user_award ua 
	LEFT JOIN  user u ON ua.user_id = u.user_id
	LEFT JOIN campaign c ON ua.campaign_id = c.campaign_id
	LEFT JOIN award a ON ua.award_id = a.award_id
WHERE
	1=1
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值