SQL(任何)请求深入了解查询优化

时间:2009-05-14 21:17:58

标签: sql optimization query-optimization sql-optimization

由于大量信息连接在一起,我的查询速度特别慢。但是我需要在id的形状中添加一个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未被选中

7 个答案:

答案 0 :(得分:2)

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

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

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

您可以发布真实的执行计划,此处的某人可能会为您提供加快速度的方法。如果您指定正在使用的数据库服务器,则会有所帮助。

答案 1 :(得分: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的每一行进行比较。

我会使用后者。

答案 2 :(得分: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,并且您很可能在优化方面倒退。 / p>

答案 3 :(得分:0)

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

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

当然不要使用select *(特别是在进行连接时从不使用它,因为至少重复了一个字段)并且浪费网络资源来发送无需数据。

答案 4 :(得分:0)

您是否看过执行计划?

怎么样

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

大概是id字段是主键吗?

答案 5 :(得分: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(选择...)任何人都会查看查询并知道您要执行的操作(仅显示在b中的if。 )。

答案 6 :(得分:0)

您的问题很可能出现在“a”

中的七个表格中

使FROM表包含“a.id” 进行下一次连接:a.id = b.id

上的内连接b

然后加入其他六个表。

如果你想要真正的帮助,你真的需要显示整个查询,列出所有索引,并估计每个表的行数