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:06 编辑
number有没有走聚集索引?而且根据你的要求,今日没有上报 这个条件,在和log表有关系时,本人感觉用not exists更好 stu.number,这个为确定且有限的集合时, not in/in 效率才会高 你有多少条数据啊,我造了100万条数据,加上time的索引,执行你的第一条 sql 也只是 2s 多而已
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]