Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 基于第三个表中不存在连接它们的行,从两个独立表中进行选择_Mysql_Sql_Join_Subquery_Query Optimization - Fatal编程技术网

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

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) 设置钥匙后,只需几秒钟。太好了。在我看来,你的问题是做你想做的事情的正确方法。我只是将老式的隐式连接重写为显式的交叉连接(但在语义上是等价的) 为了提高性

我有一个关于SQL查询的问题。 我需要两个独立表中的所有行,它们没有一行将它们连接到第三个表中。查询是这样工作的,但它的性能非常差

现在,我的查询如下所示:

表3中的关键点是:

表1有4行, 表2有80000行, 表3有30000行

有没有办法优化它? 现在查询最多需要20分钟才能给出结果

编辑: 关于20分钟->我忘了在
表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 (...)