我在坟场有一个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
答案 0 :(得分:2)
您可以将查询重新定义为使用连接而不是相关子查询:
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
的主键,在这种情况下它已经被编入索引。但您可以在tblcemetery_ID
表中向tblnames
添加索引,以提高性能:
CREATE INDEX cmtry_idx ON tblnames (tblcemetery_ID)
答案 1 :(得分:0)
或者您可以查找group by
here f.e.并执行类似
SELECT tblcemetery_ID, sum(1) from tblnames group by tblscemetery_id
对于属于这个墓地的每个名称条目,你基本上总结了1,因为你根本没有在名称中加入,不需要加入公墓细节表
不确定sum(1)
或count(*)
是否更好,两者都应该有效。
你只能获得内部有ppl的墓地
答案 2 :(得分:0)
通过使用像这样的JOIN
子句,甚至可以在没有EXISTS
的情况下完成
SELECT id, COUNT(*) AS casualtyCount
FROM tblcemetery
WHERE EXISTS (SELECT 1 FROM tblnames WHERE tblcemetery_ID=id)
GROUP BY id
ORDER BY id