这个带有NOT IN的查询速度为什么这么慢?解决办法
这个带有NOT IN的查询速度为什么这么慢?
SELECT * FROM tb2 WHERE tb2.Field1 Not IN (SELECT tb1.Field1 FROM tb1)
上面这个带有NOT IN的查询为什么这么慢?
SELECT * FROM tb2 WHERE tb2.Field1 IN (SELECT tb1.Field1 FROM tb1)
而带有IN的查询速度就很快.
我现在要用到NOT IN这种查询,该怎么办呀?
------解决方案--------------------
理论上IN子句是比较慢的,尽量用exists或者inner join
------解决方案--------------------
使用NOT EXISTS代替NOT IN。
------解决方案--------------------
SELECT * FROM tb2
WHERE tb2.Field1 IN (SELECT tb1.Field1 FROM tb1)
改为--->
SELECT * FROM tb2
WHERE EXISTS (SELECT * FROM tb1 WHERE tb1.Field1 =tb2.Field1 )
------解决方案--------------------
选有的时候用exists
选没的时候用not exists。
sql 的查询是查到有没有,这样当然快了。
SELECT * FROM tb2 WHERE tb2.Field1 Not IN (SELECT tb1.Field1 FROM tb1)
上面这个带有NOT IN的查询为什么这么慢?
SELECT * FROM tb2 WHERE tb2.Field1 IN (SELECT tb1.Field1 FROM tb1)
而带有IN的查询速度就很快.
我现在要用到NOT IN这种查询,该怎么办呀?
------解决方案--------------------
理论上IN子句是比较慢的,尽量用exists或者inner join
------解决方案--------------------
使用NOT EXISTS代替NOT IN。
------解决方案--------------------
SELECT * FROM tb2
WHERE tb2.Field1 IN (SELECT tb1.Field1 FROM tb1)
改为--->
SELECT * FROM tb2
WHERE EXISTS (SELECT * FROM tb1 WHERE tb1.Field1 =tb2.Field1 )
------解决方案--------------------
选有的时候用exists
选没的时候用not exists。
sql 的查询是查到有没有,这样当然快了。