由于大量信息连接在一起,我的查询速度特别慢。但是我需要在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未被选中
答案 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然后加入其他六个表。
如果你想要真正的帮助,你真的需要显示整个查询,列出所有索引,并估计每个表的行数