引言
问题复盘,在查询某个数据不在另一个表中,查询时间非常慢,10几秒。究其原因not in不走索引。那么怎么解决优化呢,下面是简单记录。
原SQL
select * from test
where a not in
( select a from test2 where status in (1, 2))
优化
方案一:使用LEFT JOIN
将上面的NOT IN查询语句优化为LEFT JOIN语句,可以消除子查询以及错误的执行计划的问题。因此,LEFT JOIN语句通常比NOT IN查询语句要快得多 。
SELECT itc.* FROM test itc
left join test2 ict on itc.code =ict.code
WHERE ict.vin is NULL
方案二:使用NOT EXISTS
除了LEFT JOIN方案,我们还可以使用NOT EXISTS优化方案来进行查询。使用在WHERE子句中的NOT EXISTS运算符可以避免子查询。为了将以上SQL转换为使用NOT EXISTS,我们将上述查询中的子查询嵌入到WHERE子句中。这样一来,MySQL会在表之间进行关联,比使用子查询快得多。
SELECT column1, column2, column3 FROM table1 WHERE NOT EXISTS (SELECT * FROM table2 WHERE table2.column1= table1.column1);
结果
可以看到优化后效率大大提升。