[英]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
的情况下,数据库还有很多工作要做。
如果sid
和uid
在源表中不是唯一的,那么您可以在交叉连接之前进行重复数据删除:
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.