mysql大数据量下取两张表的差集

发现之前线上接口响应缓慢,排查后发现百万数据量下sql取差集耗时过长, 查找资料后整理如下:

需求

用户表(user),提交记录表(record)。查询某天未提交的用户

表结构

user: id,name,status
record: id,uid,create
关联: user.id=record.uid

思路

取两张表的关联id(uid)的并集并作为临时表temp的id,然后count(id)=1即为两张表的差集(因为两张表union all后同一个关联id出现次数必然会大于等于2)

之前sql
select id,name from user
left join record on record.create='2020-02-11' and user.id=record.uid 
where user.status=1 and record.id is null
修改后sql
select id from (
select id from user where user.status=1
union all
select DISTINCT uid as id from record where record.create='2020-02-11'
)temp
group by id 
HAVING COUNT(id) = 1
最后

这种修改确实可以大幅提高查询效率,只是这样获取的结果只有user表的id,不能一并获取user表的其他字段比如user.name(原因是union操作要求字段属性一致,对应我们的需求就是record表也有一个与name属性一样的字段与之对应) 。所以后续可能还需要一个in操作。

扩展阅读
  1. union和union all区别
    union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;
    union All:对两个结果集进行并集操作,包括重复行,不进行排序,效率高于union ;
  2. mysql join 查询原理
  3. 参考链接
    https://bbs.csdn.net/topics/391844448
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值