首頁 >資料庫 >mysql教程 >如何有效率地統計多個資料庫連線的結果?

如何有效率地統計多個資料庫連線的結果?

Barbara Streisand
Barbara Streisand原創
2024-12-08 16:11:10220瀏覽

How to Efficiently Count Results from Multiple Database Joins?

如何以最佳效率從多個聯接中獲取計數

在資料庫查詢中,最小化聯接數量對於效能至關重要。但是,在某些情況下,可能會很想一次執行多個連線以獲得多個計數。讓我們探討一個範例並討論最佳化策略。

問題陳述

任務是計算同一主鍵上多個聯結回傳的行數。一種簡單的方法是為每個連接建立單獨的子查詢。然而,問題出現了:是否有更有效的方法來使用單一查詢來獲得相同的結果?

初始嘗試

一個方法是嘗試計算使用 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn