Mysql 基于第三个表中不存在连接它们的行,从两个独立表中进行选择
我有一个关于SQL查询的问题。 我需要两个独立表中的所有行,它们没有一行将它们连接到第三个表中。查询是这样工作的,但它的性能非常差 现在,我的查询如下所示: 表3中的关键点是: 表1有4行, 表2有80000行, 表3有30000行 有没有办法优化它? 现在查询最多需要20分钟才能给出结果 编辑: 关于20分钟->我忘了在Mysql 基于第三个表中不存在连接它们的行,从两个独立表中进行选择,mysql,sql,join,subquery,query-optimization,Mysql,Sql,Join,Subquery,Query Optimization,我有一个关于SQL查询的问题。 我需要两个独立表中的所有行,它们没有一行将它们连接到第三个表中。查询是这样工作的,但它的性能非常差 现在,我的查询如下所示: 表3中的关键点是: 表1有4行, 表2有80000行, 表3有30000行 有没有办法优化它? 现在查询最多需要20分钟才能给出结果 编辑: 关于20分钟->我忘了在表3(u\u id) 设置钥匙后,只需几秒钟。太好了。在我看来,你的问题是做你想做的事情的正确方法。我只是将老式的隐式连接重写为显式的交叉连接(但在语义上是等价的) 为了提高性
表3(u\u id)
设置钥匙后,只需几秒钟。太好了。在我看来,你的问题是做你想做的事情的正确方法。我只是将老式的隐式连接重写为显式的交叉连接(但在语义上是等价的) 为了提高性能,您需要在
表3(s\u id,u\u id)
上建立索引
但是,您需要记住,交叉连接这些表会生成一个约24亿行的派生表,因此在不存在的情况下,数据库还有很多工作要做
如果源表中的sid
和uid
不是唯一的,则可以在交叉联接之前进行重复数据消除:
select ...
from (select distinct id from table1) s
cross join (select distinct id from table3) u
where not exists (...)
请参阅“谢谢你的否决票”,但我认为我的问题,甚至我的SQL查询,对于所有接触过SQL的人来说都是非常清楚的。我还应该为三个仅带有ID的表提供CREATE TABLE代码吗?请注意,“EXIT”在MySQL中不是一个公认的术语。此外,还应该为所有相关表显示CREATE TABLE语句,关于查询性能的问题总是需要对给定的查询进行解释如果sid和uid不唯一->您的意思是表3中有几行具有相同的sid和uid->没有,这是一个进度表,因此每个组合只存在一行。关于索引->每列是索引还是多列索引?我只是读到有多个列索引,直到现在对我来说这是一个模糊的问题topic@ChrisMaster:是的,我指的是表3上的多列索引。我所说的非唯一性是指源表中的唯一性(表1和表2)。伟大的谢谢。从两个单索引改为多列索引后,请求时间减少了一半。
ALTER TABLE `table3`
ADD PRIMARY KEY (`id`),
ADD KEY `s_id` (`s_id`),
ADD KEY `u_id` (`u_id`);
select ...
from (select distinct id from table1) s
cross join (select distinct id from table3) u
where not exists (...)