[英]How to make an efficient Count of rows from another table (join)
我在墓地有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
的主鍵,在這種情況下,它已經被索引了。 但是,你可以添加索引到tblcemetery_ID
在tblnames
表為可能的性能提升:
CREATE INDEX cmtry_idx ON tblnames (tblcemetery_ID)
使用這樣的EXISTS
子句甚至可以在沒有JOIN
的情況下完成
SELECT id, COUNT(*) AS casualtyCount
FROM tblcemetery
WHERE EXISTS (SELECT 1 FROM tblnames WHERE tblcemetery_ID=id)
GROUP BY id
ORDER BY id
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.