我有一个关于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)
设置好钥匙后,只需要几秒钟。伟大的。
1条答案
按热度按时间monwx1rj1#
在我看来,你的问题是做你想做的事的正确方法。我会把旧的隐式连接改写成显式连接
cross join
(但这是语义上的é等价的)。为了提高性能,您需要在
table3(s_id, u_id)
.但是,您需要记住,交叉连接这些表会生成一个约24亿行的派生表,因此在数据库中还有很多工作要做
not exists
条件。如果
sid
以及uid
在源表中不是唯一的,则可以在交叉联接之前进行重复数据消除: