mysql - 向查询添加 COUNT 会导致查询卡住

标签 mysql sql

编辑:将其简化为最简单的示例:

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

此外,什么也没有。 解释:

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

此查询在 0.25 秒内可靠返回。这是EXPLAIN:

enter image description here

这是相同的查询,只是在 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:

enter image description here

(注意 d == a_table aeric_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/

相关文章:

mysql - 根据条件选择记录 - Joomla

MySQL在线测试工具

sql - 在SQL Server 2005中,如何设置整数列以确保值大于0?

MySQL : transaction within a stored procedure

mysql - MySQL返回结果为NULL时选择默认值

php - 将 AngularJs 连接到本地服务器 php MySQL

mysql - mysql中如何按组查找累计值?

sql - 查询完成后从 HIVE 发送电子邮件?

php - MySQL 获取上个月而不是特定周

c# - 将 "row of data"从一个 C# 控制台应用程序传递到另一个 C# 控制台应用程序的最佳方法是什么?