select * from t1 where phone not in (select phone from t2)直接就把我跑傻了。十几分钟,检查了一下 phone在两个表都建了索引,字段类型也是一样的。原来not in 是不能命中索引的。改成 NOT EXISTS 之后查询 20s ,效率真的差好多。
// 堆代码 duidaima.com select * from t1 where not EXISTS (select phone from t2 where t1.phone =t2.phone)2、容易出现问题,或查询结果有误 (不能更严重的缺点)
create table test1 (id1 int) create table test2 (id2 int) insert into test1 (id1) values (1),(2),(3) insert into test2 (id2) values (1),(2)我想要查询,在test2中存在的 test1中的id 。使用IN的一般写法是:
select id1 from test1 where id1 in (select id2 from test2)结果是:
select id1 from test1 where id1 in (select id1 from test2)不小心把id2写成id1了 ,会怎么样呢?
insert into test2 (id2) values (NULL)我想要查询,在test2中不存在的 test1中的id 。
select id1 from test1 where id1 not in (select id2 from test2)
结果是:
select * from test1 where EXISTS (select * from test2 where id2 = id1 ) select * FROM test1 where NOT EXISTS (select * from test2 where id2 = id1 )2、用JOIN 代替
select id1 from test1 INNER JOIN test2 ON id2 = id1 # 堆代码 duidaima.com select id1 from test1 LEFT JOIN test2 ON id2 = id1 where id2 IS NULL妥妥的没有问题了!