编辑:简化它是最简单的例子:
select COUNT(*)
from a_table use index(contract)
left join b_table on a_table.contract = b_table.contract
另外,没什么。 EXPLAIN
:
我有两个几乎相同的查询(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
:
以下是相同的查询,只有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
:
(请注意d
== a_table a
和eric_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
会在这里引起问题。
答案 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)
上的索引。这可能会解决您的性能问题,除非表格非常大。