簡體   English   中英

如何對另一個表進行有效的行計數(聯接)

[英]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優化器可能不夠聰明。

這種重構的一個很好的副作用是,我們現在看到了通過向聯接列添加索引來進一步提高性能的機會。 我假設idtblcemetery的主鍵,在這種情況下,它已經被索引了。 但是,你可以添加索引到tblcemetery_IDtblnames表為可能的性能提升:

CREATE INDEX cmtry_idx ON tblnames (tblcemetery_ID)

或者,您可以在此 group by查找fe並執行類似的操作

   SELECT tblcemetery_ID,  sum(1) from tblnames group by tblscemetery_id

基本上,您對屬於該公墓的每個名稱項的總和為1,因為您根本沒有對名稱的興趣,無需加入公墓詳細信息表

不知道sum(1)還是count(*)更好,兩者都應該起作用。

雖然你只會得到里面有ppl的墓地

使用這樣的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM