sql >> Database teknologi >  >> RDS >> Mysql

en optælling for hver joinforbindelse - optimering

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.



  1. Sammenligning af Galera Cluster Cloud-tilbud:Tredje del Microsoft Azure

  2. Ret "FEJL 1250 (42000):Tabel '...' fra en af ​​SELECT'erne kan ikke bruges i global ORDER-klausul", når du bruger UNION i MySQL

  3. Hvordan returnerer du kolonnenavnene for en tabel?

  4. Arbejde med MySQL-databasemotorer