mysql - 如何对另一个表中的行进行有效的计数(连接)

标签 mysql join count

我有一个包含 100,000 个墓地名字的数据库。墓地数量约为 6000 个....我希望返回每个墓地中的姓名数量..

如果我执行单个查询,则需要一毫秒

SELECT COUNT(*) FROM tblnames
    WHERE tblcemetery_ID = 2 

我的实际查询不断进行,最终我杀死了它,这样我就不会杀死我们的数据库。有人可以指出我更有效的方法吗?

select tblcemetery.id,
  (SELECT COUNT(*) FROM tblnames
        WHERE tblcemetery_ID = tblcemetery.id) AS casualtyCount
    from tblcemetery                                                      
      ORDER BY
   fldcemetery

最佳答案

您可以重新表述查询以使用联接而不是相关子查询:

SELECT
    t1.id,
    COUNT(t2.tblcemetery_ID) AS casualtyCount
FROM tblcemetery t1
LEFT JOIN tblnames t2
    ON t1.id = t2.tblcemetery_ID
GROUP BY
    t1.id
ORDER BY
    t1.id

我听说在某些数据库(例如 Oracle)中,优化器足够聪明,可以弄清楚我上面写的内容,并会在幕后重构您的查询。但 MySQL 优化器可能不够智能,无法做到这一点。

此重构的一个很好的副作用是,我们现在看到了通过向连接列添加索引来进一步提高性能的机会。我假设 id 是 tblcemetery 的主键,在这种情况下它已经被索引。但是您可以向 tblnames 表中的 tblcemetery_ID 添加索引,以提高性能:

CREATE INDEX cmtry_idx ON tblnames (tblcemetery_ID)

关于mysql - 如何对另一个表中的行进行有效的计数(连接),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46813566/

相关文章:

连接表和多个值的 SQL 查询

sql - COUNT 的 PostgreSQL 值乘以一个数字

php - 从 laravel Eloquent 数据透视表中获取计数

sql - 选择除一个字段以外的所有字段?

php - 我的数据库的高级组织,需要提示

mysql - 托管数据库 v 云数据库

mysql - 如何连接两个mysql状态不同的表

mysql - Doctrine 选择 innerJoined 实体或没有关联的实体

mysql - 在 MySQL 或查询生成器中使用 LEFTJOIN 进行 SELECT 和 COUNT

mysql - 统计关键字(在一个表中)在另一个表的字段中出现的次数