Left Join adalah salah satu dari beberapa tipe join yang terdapat di SQL untuk mengkombinasikan lebih dari satu tabel. Mengkombinasikan lebih dari satu tabel akan mempengaruhi kecepatan suatu query dalam berinteraksi dengan database. Hal ini akan mengakibatkan aplikasi lebih lambat menampilkan informasi. Pada tulisan kali ini saya akan mengambil contoh penggunaan Left Join dengan 2 tabel, yaitu tabel berita dan tabel komentar dengan key berita_id.
Tabel berita memiliki attribut berita_id, tanggal, judul dan berita. Tabel komentar memiliki attribut komentar_id, pengirim, email, komentar dan berita_id. Kedua tabel ini hanya merupakan sampel yang kondisinya memenuhi syarat untuk menggunakan LEFT JOIN. Kalaupun ada kesamaan tokoh, karakter dan lain sebagainya bukanlah disengaja (koq kayak filem ya? hihihihi)
Untuk menampilkan informasi dari berita dengan jumlah komentar pada setiap berita, dapat menggunakan query berikut :
SELECT A.berita_id, A.judul, A.berita, COALESCE(COUNT(B.komentar_id), 0)
AS total_komentar FROM berita A LEFT JOIN komentar B
USING(berita_id) GROUP BY A.berita_id ORDER BY berita_id DESC
Kenapa query di atas bisa menjadi lambat dengan data dalam jumlah besar?
Karena query tersebut menghitung jumlah key pada tabel sebelah kanan (komentar) sebanyak key pada tabel sebelah kiri (berita). Maka jika tabel berita berisi 4000 data dan tabel komentar berisi 8000 data, maka query diatas akan melakukan pengecekan jumlah komentar sebanyak 4000 kali terhadap 8000 data komentar.
Bagaimana cara mengoptimasinya?
Query diatas dapat dioptimasi dengan membuat tabel di sebelah kanan (komentar) jumlah datanya lebih kecil atau sama dengan jumlah data pada tabel sebelah kiri (berita), dan tidak menghitung key pada tabel sebelah kanan sebanyak jumlah key pada tabel sebelah kiri (berita). Untuk melakukan hal ini bisa dengan menggunakan subquery.
SELECT A.berita_id, A.judul, A.berita, COALESCE(B.total_komentar, 0)
AS total_komentar FROM berita A LEFT JOIN
(SELECT berita_id, COUNT(komentar_id) AS total_komentar
FROM komentar GROUP BY berita_id) B
USING(berita_id) GROUP BY A.berita_id ORDER BY berita_id DESC
Dari query diatas, dapat dilihat tabel sebelah kanan (komentar) berisi subquery yang menghasilkan attribut berita_id dan total_komentar dengan jumlah data yang lebih kecil atau sama dengan jumlah data pada tabel sebelah kiri (berita). Kemudian dengan tabel sebelah kiri dan kanan dikombinasikan tanpa ada penghitungan key pada tabel sebelah kanan sebanyak key pada tabel sebelah kiri. Query ini jika dieksekusi akan memakan waktu sebesar 0.01 detik jauh lebih kecil dari query yang sebelumnya.
Sejauh ini saya masih menggunakan subquery untuk mengoptimasi LEFT JOIN pada contoh kasus seperti di atas. Pada contoh kasus di atas penggunaan subquery meningkatkan waktu eksekusi sebesar 90%.