在查询中添加COUNT会导致查询卡住

时间:2015-05-15 14:27:04

标签: mysql sql

编辑:简化它是最简单的例子:

select COUNT(*)
from a_table use index(contract)
left join b_table on a_table.contract = b_table.contract

另外,没什么。 EXPLAIN

enter image description here

我有两个几乎相同的查询(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

此查询在.25秒内可靠地返回。这是EXPLAIN

enter image description here

以下是相同的查询,只有COUNT()周围的if

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

enter image description here

(请注意d == a_table aeric_tmp == b_table。希望不要太混淆。)

这是导致kerfuffle的原始查询,上面是尝试重写它:

select count(*) from a_table a
where not exists (select 1 from b_table b where a.contract = b.contract)

当然也挂了。到底发生了什么事?我已经尝试添加和使用非唯一索引,但它似乎也没有帮助。我不明白为什么COUNT会在这里引起问题。

1 个答案:

答案 0 :(得分:0)

您可能会在返回第一行而不是最后一行时考虑第一个查询。第二个查询需要经过所有数据,然后才能返回任何数据。

子查询(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)上的索引。这可能会解决您的性能问题,除非表格非常大。