0

由于大量信息被连接在一起,我的查询特别慢。但是,我需要以 id in 的形式添加 where 子句(从表中选择 id)。

我想知道以下是否有任何收获,更紧迫的是,它是否会给出预期的结果。

select a.* from a where a.id in (select id from b where b.id = a.id)

作为替代方案:

select a.* from a where a.id in (select id from b)

更新:MySQL 不能更具体,抱歉表 a 实际上是 7 个不同表之间的连接。* 用于示例

编辑,b 没有被选中

4

7 回答 7

2

您列出的两个查询都相当于:

select a.* 
from a 
inner join b on b.id = a.id

几乎所有的优化器都会以同样的方式执行它们。

你可以发布一个真正的执行计划,这里的某个人可能会给你一种加快速度的方法。如果您指定您正在使用的数据库服务器,它会有所帮助。

于 2009-05-14T21:27:56.260 回答
2

您的问题是关于这两者之间的区别:

select a.* from a where a.id in (select id from b where b.id = a.id)

select a.* from a where a.id in (select id from b)

前者是相关子查询。它可能会导致 MySQL 对a.

后者是一个不相关的子查询。MySQL 应该能够执行一次并缓存结果,以便与a.

我会使用后者。

于 2009-05-14T22:21:04.807 回答
0

YMMV,但我经常发现使用 EXISTS 而不是 IN 可以使查询运行得更快。

SELECT a.* FROM a WHERE EXISTS (SELECT 1 FROM b WHERE b.id = a.id)

当然,如果不查看查询的其余部分和上下文,这可能不会使查询变得更快。

JOINing 可能是一个更可取的选择,但如果 a.id 在 b 的 id 列中出现多次,您将不得不在其中抛出一个 DISTINCT,并且您很可能会在优化方面倒退。

于 2009-05-14T21:21:52.750 回答
0

我永远不会使用这样的子查询。加入会快得多。

select a.*
from a 
join b on a.id = b.id

当然也不要使用 select * (尤其是在进行连接时永远不要使用它,因为至少有一个字段重复),它会浪费网络资源来发送不需要的数据。

于 2009-05-14T21:22:13.247 回答
0

你看过执行计划吗?

怎么样

select a.* 
from a 
inner join b
on a.id = b.id

大概 id 字段是主键?

于 2009-05-14T21:23:33.603 回答
0
Select a.* from a
inner join (Select distinct id from b) c
on a.ID = c.AssetID

我尝试了所有 3 个版本,它们的运行情况大致相同。执行计划相同(内连接,IN(子查询中有无where子句),Exists)

由于您没有从 B 中选择任何其他字段,因此我更喜欢使用 Where IN(Select...) 任何人都会查看查询并知道您要做什么(仅在 b 中的 if 中显示)。

于 2009-05-14T21:32:52.147 回答
0

您的问题很可能在“a”中的七个表中

使 FROM 表包含“a.id” 进行下一个连接:inner join b on a.id = b.id

然后加入其他六个表。

如果您需要真正的帮助,您确实需要显示整个查询、列出所有索引以及每个表的大致行数

于 2009-05-14T21:50:49.637 回答