繁体   English   中英

select 来自两个独立表,基于第三个表中不存在加入它们的行

[英]select from two independent table based on not exist a row in a third table joining them

我对 SQL 查询有疑问。 我需要两个独立表中的所有行,这些表没有将它们连接到第三个表中的行。 查询以这种方式工作,但性能非常差。

现在我的查询如下所示:

SELECT s.id, 
       u.id 
FROM   table1 s, 
       table2 u 
WHERE  NOT EXISTS
       ( 
              SELECT * 
              FROM   table3 sj 
              WHERE  sj.s_id=s.id 
              AND    sj.u_id=u.id
       )

表 3 上的键是:

ALTER TABLE `table3`
    ADD PRIMARY KEY (`id`),
    ADD KEY `s_id` (`s_id`),
    ADD KEY `u_id` (`u_id`);

table1 有 4 行,table2 有 80.000 行,table3 有 30.000 行

任何想法如何优化它? 现在查询最多需要 20 分钟才能给出结果。

编辑:关于 20 分钟-> 我忘了在table3(u_id)上设置一个密钥设置密钥后只需要几秒钟。 伟大的。

在我看来,您的查询似乎是做您想做的事情的正确方法。 我只是将老式的隐式连接重写为显式cross join (但这在语义上是等价的)。

为了提高性能,您需要table3(s_id, u_id)上的索引。

但是,您需要记住,交叉连接表会生成大约 24 亿行的派生表,因此在not exists的情况下,数据库还有很多工作要做。

如果siduid在源表中不是唯一的,那么您可以在交叉连接之前进行重复数据删除:

select ...
from (select distinct id from table1) s
cross join (select distinct id from table3) u 
where not exists (...)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM