使用SQL命令的in&not in等删除数据的总结
总结:
1、查询时用 not in 效率极其低下,因此结合left join改为in查询,效率很快
原语句:
select * from my_test_table where id not in (select b.id as id from ( SELECT MAX(a.`ModifyAt`)ModifyAt,a.userid FROM my_test_table a GROUP BY a.UserId,a.SeriesId,a.CourseId) c INNER JOIN `my_test_table` b ON c.userid=b.userid AND c.ModifyAt=b.ModifyAt)
优化后:
select * from (select u.id as id from my_test_table u left join (select b.id as id from ( SELECT MAX(a.`ModifyAt`)ModifyAt,a.userid FROM my_test_table a GROUP BY a.UserId,a.SeriesId,a.CourseId) c INNER JOIN `my_test_table` b ON c.userid=b.userid AND c.ModifyAt=b.ModifyAt) d on d.id = u.id where d.Id is null) as e
2、查询出后,需要用 delete where in 来删除,但是delete where in 语句效率极其低下。
原语句:
delete from my_test_table where id in (select * from (select u.id as id from my_test_table u left join (select b.id as id from ( SELECT MAX(a.`ModifyAt`)ModifyAt,a.userid FROM my_test_table a GROUP BY a.UserId,a.SeriesId,a.CourseId) c INNER JOIN `my_test_table` b ON c.userid=b.userid AND c.ModifyAt=b.ModifyAt) d on d.id = u.id where d.Id is null) as e)
因此改为where语句,关联表删除数据 优化后:
delete deluser from my_test_table deluser,(select * from (select u.id as id from my_test_table u left join (select b.id as id from ( SELECT MAX(a.`ModifyAt`)ModifyAt,a.userid FROM my_test_table a GROUP BY a.UserId,a.SeriesId,a.CourseId) c INNER JOIN `my_test_table` b ON c.userid=b.userid AND c.ModifyAt=b.ModifyAt) d on d.id = u.id where d.Id is null) as e) f where deluser.id = f.id;
0.36秒执行完成。
参考文章:
相关推荐
vitasfly 2020-11-12
gsmfan 2020-07-26
明月清风精进不止 2020-07-05
FORYAOSHUYUN 2020-07-05
URML 2020-07-04
minggehenhao 2020-06-21
hungzz 2020-06-16
FellowYourHeart 2020-10-05
好记忆也需烂 2020-07-28
专注前端开发 2020-10-21
苏康申 2020-11-13
oraclemch 2020-11-06
liuyang000 2020-09-25
赵继业 2020-08-17
whyname 2020-08-16
Seandba 2020-08-16
dbasunny 2020-08-16
拼命工作好好玩 2020-08-15