Optimasi Left Join Dengan Subquery di MySQL

Tagged:

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%.

Comments

Tuk tutorial Join Left ini scriptnya cck buat kita-kita yang ingin meload tampilan tabel lebih cepat. Klo blh request AJAX dunk's

Hehehe

NAL

hwalah...
komen dulu baru baca...

baca komen aja deh... :P

Iya, om...
bikinin tutorial ajax duonx...

pake bahasa Indonesia ajah... :P

pak, kalo ada proyek web development php+mysql secara remote, bisa kan?

@rizahnst
Bisa banget bro.
Ditunggu ya...

mas...
kalo pengen nampilin data dari 2 tabel gmn neeh??
contoh kasus
kita pengen nampilin berita berdasarkan kategori dan kategorinya
nah setiap kategori berisi isi berita tsb...

tblnya
tbl_berita -> id, judul, isi, author, kategori

tbl_kategori -> kode_kategori, kategori

gmn script querynya??? plz help me!!!!
thx before :)

@abdie
Di tabel berita itu seharusnya field kode_kategori bukan kategori. Karena di tabel berita itu sebaiknya kita simpan kodenya saja, bukan kategorinya.

Jadi strukturnya seperti ini :
tbl_berita -> id, judul, isi, author, kode_kategori
tbl_kategori -> kode_kategori, kategori

Untuk menampilkan berita berdasarkan kategorinya, bisa menggunakan query berikut:

SELECT A.*, B.kategori FROM tbl_berita A INNER JOIN tbl_kategori B USING(kode_kategori) WHERE B.kode_kategori = [kode_kategori]

Mudah - mudahan bisa membantu ;)

mas bisa g jelasin optimasi query di mysql pake teknik cost based optimization,,trus cara untuk ngeliat execution plannya gimn?

mas ,saya mou tanya nih ttg optimasi query di mysql pake teknik cost based optimization,bisa g dijelasin,n kalo pengen ngeliat execution plan di mysql gimana caranya,,,trus dimana aku bisa dapetin referensi mengenai cbo...thanks

mas.bs jelasin fungsi dr force index,analyze.straight join ga? sm syntaknya skalian? trus simple sql optimizer itu apa sih?

MAS,KALO kasusnya sm sprti diatas dlm optimalisasi left join dng subquery.tp untk di oracle ap syntak querynya sama.sebab ak mo coba dioracle?

Wah, gak tau juga mas. Tapi biasanya kelakuan dari masing - masing RDBMS itu beda - beda. Jadi gak bisa disamakan.

Kirim Komentar

Tidak akan dipublikasikan
  • Alamat web dan email dirubah menjadi hyperlink secara otomatis
  • Tag HTML yang diizinkan: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Baris baru maupun paragraph dipisahkan secara otomatis

Informasi lebih lanjut tentang format pesan