我有一个包含 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/