有什么方法可以更快地查询包含in子句的sql查询,其中in子句的数据是从with in查询获得的?

yks3o0rb  于 2021-06-20  发布在  Mysql
关注(0)|答案(5)|浏览(353)

在我的项目中,我遇到了一个需求,在这个需求中,我需要对某个地址处理一些操作,而这个地址不在其他表中,为此,我编写了以下查询。但是我认为当第二个表'transaction'中的条目增加时,这个查询会变慢。

select emp_address
from emp_leave_wallet
where attached  ="mycompany_wallet" and
      emp_address not in (select destination_address from transaction);

任何其他方式,除了在目标地址上添加索引。

velaa5lx

velaa5lx1#

使用 JOIN 但我无法量化绩效收益:

SELECT ew.emp_address
FROM emp_leave_wallet ew
LEFT OUTER JOIN transaction t on
    t.emp_address = ew.emp_address
WHERE ew.attached = "mycompany_wallet" and
      t.emp_address IS NULL
0ejtzxu1

0ejtzxu12#

使用 not exists :

select ew.emp_addres
from emp_leave_wallet ew
where ew.attached = "mycompany_wallet" and
      not exists (select 1 from transaction t where t.destination_address = ew.emp_address);
smdncfj3

smdncfj33#

我会从 not exists :

select lw.emp_address
from emp_leave_wallet lw
where lw.attached  = 'mycompany_wallet' and
      not exists (select 1
                  from destination_address da
                  where lw.emp_address = da.destination_address 
                 );

那么对于这个查询,您肯定需要一个索引 destination_address(destination_address) 可能是在 (attached, emp_address) .

beq87vna

beq87vna4#

select emp_address
from emp_leave_wallet
where attached  ="mycompany_wallet" and
      emp_address not in (select destination_address from transaction);

你的 emp_leave_wallet 以及 transaction 表应该有id字段(我猜。。。 emp_id , transaction_id )
如果是我我会。。。

select emp_address
from emp_leave_wallet elw
inner join transaction t
on elw.emp_id = t.transacation_id
nnsrf1az

nnsrf1az5#

使用 NOT EXISTS 如果中没有匹配的行,则返回记录 transaction 表基于 where 条件:

select emp_address
from emp_leave_wallet e
where attached = 'mycompany_wallter'
  and not exists (
    select 1
    from transaction t
    where e.emp_address = t.destination_address
    )

创建索引:

CREATE INDEX idx1 ON emp_leave_wallet(attached, emp_address);
CREATE INDEX idx2 ON transaction(destination_address);

相关问题