现在有一张表A(字段id,tel)tel表示手机号码,有6万条记录。表B(字段id,login_name)login_name也表示手机号码,有10万条记录,表A中有部分号码在表B中,要求出表A不在B中的号码我的数据库是mysql
select a.tel
from z_a_member a
where not in (select b.login_name from z_member b)这sql是我写的,不知道何时能出结果请教高手,有没有效率比较高的办法
select a.tel
from z_a_member a
where not in (select b.login_name from z_member b)这sql是我写的,不知道何时能出结果请教高手,有没有效率比较高的办法
from z_a_member a
where not exists (select b.login_name from z_member b where a.id = b.id)
1.把not in改为not exists
2.在B表的id上建立个索引
where not exists(select 1 from z_member b where b.login_name =a.tel)
SQL中的MINUS关键字
SQL中有一个MINUS关键字,它运用在两个SQL语句上,它先找出第一条SQL语句所产生的结果,然后看这些结果有没有在第二个SQL语句的结果中。如果有的话,那这一笔记录就被去除,而不会在最后的结果中出现。如果第二个SQL语句所产生的结果并没有存在于第一个SQL语句所产生的结果内,那这笔资料就被抛弃,其语法如下:
[SQL Segment 1]
MINUS
[SQL Segment 2]
其实简单的一句话就是找出第一条SQL查询的不在第二条SQL语句查询结果中的那些记录,并且要注意最后返回的结果集中,不同的记录只会被列出一次!
下面是我做的实验,很明显能够看出MINUS的效率,made_order共23万笔记录,charge_detail共17万笔记录
性能比较:
SELECT order_id FROM made_order
MINUS
SELECT order_id FROM charge_detail
1.14 sec
SELECT a.order_id FROM made_order a
WHERE NOT exists (
SELECT 1
FROM charge_detail
WHERE order_id = a.order_id
)
18.19 sec
SELECT order_id FROM made_order
WHERE order_id NOT in (
SELECT order_id
FROM charge_detail
)
20.05 sec