Af optimeringsformål er en god tommelfingerregel at deltage mindre, ikke mere. Faktisk bør du prøve at slutte dig til så få rækker som du kan med så få rækker som du kan. Med enhver yderligere joinforbindelse, vil du gange omkostningerne i stedet for at tilføje omkostninger. Fordi mysql i bund og grund bare vil generere en stor multipliceret matrix. Meget af det bliver dog optimeret af indekser og andre ting.
Men for at besvare dit spørgsmål:det er faktisk muligt at tælle med kun én stor join, forudsat at bordene har unikke nøgler og idalb er en unik nøgle til album. Så, og kun da, kan du gøre det på samme måde som din kode:
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
hvor PrimaryKeyFields står for de primære nøglefelter i de sammenføjede tabeller (du skal slå dem op).
Distinct
vil fjerne den effekt, de andre joins har på optællingen. Men desværre, generelt, distinct
vil ikke fjerne den effekt, sammenføjningerne har på omkostningerne.
Selvom du har indekser, der dækker alle (idAlb + PrimaryKeyFields)-felter i dine tabeller, kan det være lige så hurtigt som den oprindelige løsning (fordi det kan optimere distinct
for ikke at foretage en sortering) og vil komme tæt på det, du tænkte på (bare at gå gennem hver tabel/indeks én gang). Men i et normalt eller værste tilfælde bør det fungere dårligere end en rimelig løsning (som SlimGhosts) - fordi det er tvivlsomt, om det vil finde den optimale strategi. Men leg lidt med det og tjek forklaringerne (og post resultaterne), måske vil mysql gøre noget skørt.