编辑:将其简化为最简单的示例:
select COUNT(*)
from a_table use index(contract)
left join b_table on a_table.contract = b_table.contract
此外,什么也没有。 解释
:
我有两个几乎相同的查询(b_table
是一个临时表):
select IF (b.contract IS NULL, 1, NULL) c
from a_table a
left join (select contract from b_table) b on a.contract = b.contract
此查询在 0.25 秒内可靠返回。这是EXPLAIN
:
这是相同的查询,只是在 if
周围有一个 COUNT()
:
select COUNT(IF (b.contract IS NULL, 1, NULL)) c
from a_table a
left join (select contract from b_table) b on a.contract = b.contract
这个显示“发送数据”,至少几分钟后,似乎挂起,我什么也得不到。这是EXPLAIN
:
(注意 d
== a_table a
和 eric_tmp
== b_table
。希望不会太困惑。 )
这是导致困惑的原始查询,上面试图重写它:
select count(*) from a_table a
where not exists (select 1 from b_table b where a.contract = b.contract)
当然也挂了。这到底是怎么回事?我试过添加和使用非唯一索引,但似乎也无济于事。我不明白为什么 COUNT
会在这里引起问题。
最佳答案
您可能认为第一个查询在返回第一行而不是最后一行时完成。第二个查询需要遍历所有数据,然后才能返回任何内容。
子查询(MySQL 称之为“派生表”)会影响性能。消极的。
您的not exists
查询非常合理:
select count(*)
from a_table a
where not exists (select 1 from b_table b where a.contract = b.contract);
为了性能,您需要在 b_table(contract)
上建立索引。这可能会解决您的性能问题,除非表格真的很大。
关于mysql - 向查询添加 COUNT 会导致查询卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30262024/