如何以最佳效率從多個聯接中獲取計數
在資料庫查詢中,最小化聯接數量對於效能至關重要。但是,在某些情況下,可能會很想一次執行多個連線以獲得多個計數。讓我們探討一個範例並討論最佳化策略。
問題陳述
任務是計算同一主鍵上多個聯結回傳的行數。一種簡單的方法是為每個連接建立單獨的子查詢。然而,問題出現了:是否有更有效的方法來使用單一查詢來獲得相同的結果?
初始嘗試
一個方法是嘗試計算使用 case語句進行多個連接的結果,如下所示:
select alb.titreAlb as "Titre", sum(case when alb.idAlb=payalb.idAlb then 1 else 0 end) "Pays", sum(case when alb.idAlb=peralb.idAlb then 1 else 0 end) "Personnages", sum(case when alb.idAlb=juralb.idAlb then 1 else 0 end) "Jurons" from album alb left join pays_album payalb using ( idAlb ) left join pers_album peralb using ( idAlb ) left join juron_album juralb using ( idAlb ) where alb.titreAlb = "LES CIGARES DU PHARAON" group by alb.titreAlb
但是,此方法計算的是跨行的總行數
最佳化解
要最佳化查詢並為每個聯結取得單獨的計數,您可以在單一查詢中利用DISTINCT。每個涉及的表都需要一個唯一的鍵,而 idalb 列必須是專輯表的唯一鍵。修改後的查詢如下:
select alb.titreAlb as "Titre", count(distinct payalb.idAlb, payalb.PrimaryKeyFields) "Pays", count(distinct peralb.idAlb, peralb.PrimaryKeyFields) "Personnages", count(distinct juralb.idAlb, juralb.PrimaryKeyFields) "Jurons" from album alb left join pays_album payalb using ( idAlb ) left join pers_album peralb using ( idAlb ) left join juron_album juralb using ( idAlb ) where alb.titreAlb = "LES CIGARES DU PHARAON" group by alb.titreAlb
在此查詢中,distinct 消除了其他連接對計數的影響。然而,重要的是要記住,不同的不一定消除連接的成本。如果覆蓋索引可用於表的所有 (idAlb PrimaryKeyFields) 字段,則此方法可能會產生與原始解決方案相當的速度,其中每個連接都是單獨執行的。儘管如此,使用 EXPLAIN 進行測試可以幫助確定最佳策略。
以上是如何有效率地統計多個資料庫連線的結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!