Untuk tujuan pengoptimalan, aturan praktis yang baik adalah bergabung lebih sedikit, tidak lebih. Sebenarnya, Anda harus mencoba menggabungkan baris sesedikit mungkin dengan baris sesedikit mungkin. Dengan tambahan bergabung, Anda akan melipatgandakan biaya alih-alih menambah biaya. Karena mysql pada dasarnya hanya akan menghasilkan matriks berlipat ganda. Banyak dari itu yang dioptimalkan oleh indeks dan hal-hal lain.
Tetapi untuk menjawab pertanyaan Anda:sebenarnya mungkin untuk menghitung hanya dengan satu gabungan besar, dengan asumsi tabel memiliki kunci unik dan idalb adalah kunci unik untuk album. Kemudian, dan baru setelah itu, Anda dapat melakukannya seperti kode Anda:
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
di mana PrimaryKeyFields adalah singkatan dari bidang kunci utama dari tabel yang digabungkan (Anda harus mencarinya).
Distinct
akan menghapus efek yang dimiliki gabungan lainnya pada hitungan. Namun sayangnya, secara umum, distinct
tidak akan menghilangkan efek gabungan pada biaya.
Meskipun, jika Anda memiliki indeks yang mencakup semua (idAlb + PrimaryKeyFields) -bidang tabel Anda, itu mungkin secepat solusi asli (karena dapat mengoptimalkan distinct
untuk tidak melakukan penyortiran) dan akan mendekati apa yang Anda pikirkan (hanya berjalan melalui setiap tabel/indeks sekali). Tetapi dalam szenario kasus normal atau terburuk, itu harus berkinerja lebih buruk daripada solusi yang masuk akal (seperti solusi SlimGhost) - karena diragukan akan menemukan strategi yang optimal. Tapi bermain-main dengannya dan periksa penjelasannya (dan posting temuannya), mungkin mysql akan melakukan sesuatu yang gila.