从两个独立的表中选择基于不存在第三个表中的行连接它们

c8ib6hqw  于 2021-08-13  发布在  Java
关注(0)|答案(1)|浏览(250)

我有一个关于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`);

表1有4行,表2有8万行,表3有3万行
有什么办法优化它吗?现在查询最多需要20分钟才能给出结果。
编辑:关于20分钟->我忘了在 table3(u_id) 设置好钥匙后,只需要几秒钟。伟大的。

monwx1rj

monwx1rj1#

在我看来,你的问题是做你想做的事的正确方法。我会把旧的隐式连接改写成显式连接 cross join (但这是语义上的é等价的)。
为了提高性能,您需要在 table3(s_id, u_id) .
但是,您需要记住,交叉连接这些表会生成一个约24亿行的派生表,因此在数据库中还有很多工作要做 not exists 条件。
如果 sid 以及 uid 在源表中不是唯一的,则可以在交叉联接之前进行重复数据消除:

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

相关问题