Cara Mendapatkan Kiraan daripada Berbilang Gabungan dengan Kecekapan Optimum
Dalam pertanyaan pangkalan data, meminimumkan bilangan gabungan adalah penting untuk prestasi. Walau bagaimanapun, mungkin terdapat senario yang menggoda untuk melakukan berbilang cantuman sekaligus untuk mendapatkan berbilang kiraan. Mari kita terokai contoh dan bincangkan strategi pengoptimuman.
Pernyataan Masalah
Tugasnya ialah mengira baris yang dikembalikan oleh berbilang cantuman pada kunci utama yang sama. Pendekatan yang mudah melibatkan penciptaan subkueri individu untuk setiap penyertaan. Walau bagaimanapun, persoalan timbul: adakah terdapat cara yang lebih cekap untuk mencapai hasil yang sama menggunakan satu pertanyaan?
Percubaan Awal
Satu pendekatan ialah cuba mengira hasil gabungan berbilang menggunakan pernyataan kes, seperti yang ditunjukkan di bawah:
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
Walau bagaimanapun, kaedah ini mengira jumlah bilangan baris merentas semua jadual yang dicantumkan, mengakibatkan keputusan yang salah.
Penyelesaian Pengoptimuman
Untuk mengoptimumkan pertanyaan dan mendapatkan kiraan berasingan bagi setiap penyertaan, anda boleh memanfaatkan DISTINCT dalam satu pertanyaan . Kunci unik diperlukan untuk setiap jadual yang terlibat dan lajur idalb mestilah kunci unik untuk jadual album. Pertanyaan yang disemak adalah seperti berikut:
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
Dalam pertanyaan ini, distinct mengalih keluar kesan cantuman lain pada kiraan. Walau bagaimanapun, adalah penting untuk diingat bahawa berbeza tidak semestinya menghapuskan kos penyertaan. Jika indeks meliputi tersedia untuk semua medan (idAlb PrimaryKeyFields) bagi jadual, pendekatan ini mungkin menghasilkan kelajuan yang setanding dengan penyelesaian asal, di mana setiap cantuman dilakukan secara berasingan. Namun begitu, ujian dengan EXPLAIN boleh membantu menentukan strategi optimum.
Atas ialah kandungan terperinci Bagaimana untuk Mengira Keputusan dengan Cekap daripada Gabungan Pelbagai Pangkalan Data?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!