utibet田同学 发表于 2021-1-17 15:06

SQL not in语句优化

需求:在B表(上报情况)中找出今日没有上报的同学,参照A表(学生名单)。

目前方法:
select number,name,class,org_id from student_info wherenumber not in( SELECT number from sub_log where TO_DAYS(time) = TO_DAYS(NOW()))



SELECTstu.number, stu.name, stu.class, stu.org_id
FROM    student_info stu
      LEFT JOIN sub_log sub
            ONstu.number = sub.number AND
                TO_DAYS(time) = TO_DAYS(NOW())
WHERE   sub.number IS NULL


执行速度都在30s左右了

不忘初心哟 发表于 2021-1-17 16:02

本帖最后由 不忘初心哟 于 2021-1-17 16:06 编辑

number有没有走聚集索引?而且根据你的要求,今日没有上报 这个条件,在和log表有关系时,本人感觉用not exists更好

不忘初心哟 发表于 2021-1-17 16:07

stu.number,这个为确定且有限的集合时, not in/in 效率才会高

VioletKiss 发表于 2021-1-18 11:13

你有多少条数据啊,我造了100万条数据,加上time的索引,执行你的第一条 sql 也只是 2s 多而已

singledog 发表于 2021-1-19 14:30

SELECTstu.number, stu.name, stu.class, stu.org_id
FROM    student_info stu
WHEREsub.number IS NULL AND NOT EXISTS (
      SELECT 1 from sub_log sub
            WHEREstu.number = sub.number AND
                TO_DAYS(time) = TO_DAYS(NOW() )
换成这种EXISTS 执行下试试
页: [1]
查看完整版本: SQL not in语句优化