Penjelasan MySQL EXPLAIN: Cara Membaca Rencana Eksekusi dan Mengoptimalkan Query SQL

目次

1. Apa Itu MySQL EXPLAIN? Mengapa Anda Harus Menggunakannya?

Apa Itu EXPLAIN? Perintah untuk Memvisualisasikan Rencana Eksekusi

Di MySQL, EXPLAIN adalah perintah yang digunakan untuk memvisualisasikan bagaimana sebuah kueri SQL dieksekusi. Perintah ini sangat membantu untuk memahami bagaimana data diambil dalam pernyataan SELECT, dan menampilkan rencana eksekusi kueri.

Sebagai contoh, saat mengeksekusi kueri seperti SELECT * FROM users WHERE age > 30, EXPLAIN memungkinkan Anda melihat detail internal seperti indeks mana yang digunakan MySQL dan dalam urutan apa tabel dipindai.

Penggunaannya sederhana — cukup tambahkan EXPLAIN di awal kueri Anda.

EXPLAIN SELECT * FROM users WHERE age > 30;

Ketika ditulis seperti ini, beberapa kolom yang menjelaskan rencana eksekusi kueri akan ditampilkan. Setiap item akan dijelaskan secara detail pada bagian berikutnya.

Mengapa Anda Harus Menggunakannya: Membuat Penyebab Kueri Lambat Terlihat

Kesalahan umum yang dilakukan banyak pengembang adalah mengasumsikan bahwa “jika SQL berfungsi, tidak ada masalah.” Namun, eksekusi kueri yang lambat dapat berdampak negatif pada kinerja keseluruhan aplikasi.

Dalam sistem yang menangani volume data besar, bahkan satu kueri yang tidak efisien dapat menjadi bottleneck dan memberikan beban signifikan pada server.

Di sinilah EXPLAIN menjadi sangat berguna. Dengan meninjau rencana eksekusi, Anda dapat dengan jelas melihat apakah pemindaian tabel penuh sedang dilakukan atau apakah indeks telah digunakan dengan tepat.

Dengan kata lain, menggunakan EXPLAIN memungkinkan Anda mengidentifikasi bottleneck kinerja dan menentukan cara mengoptimalkannya. Efektivitas indeks, khususnya, menjadi jauh lebih jelas saat menganalisis output EXPLAIN.

Pernyataan SQL yang Didukung oleh EXPLAIN (SELECT, UPDATE, dll.)

EXPLAIN tidak hanya bekerja dengan pernyataan SELECT tetapi juga dengan pernyataan SQL berikut:

  • SELECT
  • DELETE
  • INSERT
  • REPLACE
  • UPDATE

Sebagai contoh, saat menjalankan pernyataan DELETE pada dataset besar, jika indeks tidak digunakan dengan tepat, MySQL dapat melakukan pemindaian tabel penuh, yang secara signifikan meningkatkan waktu eksekusi. Untuk mencegah masalah tersebut, sangat efektif untuk memeriksa rencana eksekusi dengan EXPLAIN sebelum menjalankan pernyataan DELETE atau UPDATE.

Tergantung pada versi MySQL Anda, Anda juga dapat menggunakan EXPLAIN ANALYZE, yang memberikan informasi eksekusi yang lebih detail. Hal ini akan dibahas lebih lanjut di artikel ini.

2. Memahami Kolom Output EXPLAIN (Dengan Gambar Ilustrasi)

Daftar dan Penjelasan Kolom Output Dasar

Output EXPLAIN mencakup kolom-kolom berikut (sedikit berbeda tergantung pada versi MySQL):

Column NameDescription
idIdentifier indicating execution order or grouping within the query
select_typeThe type of SELECT (e.g., subquery, UNION)
tableName of the table being accessed
typeJoin type (access method)
possible_keysPossible indexes that could be used
keyActual index used
key_lenLength of the used index (in bytes)
refValue compared against the index
rowsEstimated number of rows MySQL expects to scan
ExtraAdditional details (sorting, temporary tables, etc.)

Di antara kolom-kolom tersebut, empat kolom terpenting untuk penyetelan kinerja adalah type / key / rows / Extra.

Cara Membaca Empat Kolom Kunci: type / key / rows / Extra

1. type (Metode Akses)

Kolom ini menunjukkan bagaimana MySQL mengakses tabel. Hal ini secara langsung memengaruhi kinerja.

Example ValueMeaningPerformance Level
ALLFull table scan✕ Slow
indexFull index scan△ Moderate
rangeRange scan○ Good
ref / eq_refIndex lookup◎ Excellent
const / systemSingle-row access◎ Very Fast

Jika type = ALL, berarti tidak ada indeks yang digunakan dan semua baris dipindai — metode akses paling lambat. Idealnya, Anda harus mengoptimalkan kueri menuju ref atau const.

2. key (Indeks yang Digunakan)

Kolom ini menampilkan nama indeks yang sebenarnya digunakan.
Jika tidak ada yang ditampilkan, kemungkinan kueri tidak menggunakan indeks.

3. rows (Perkiraan Baris yang Dipindai)

Ini menunjukkan berapa banyak baris yang diperkirakan MySQL akan pindai. Semakin besar angkanya, semakin lama waktu eksekusi cenderung. Tujuannya adalah mengoptimalkan kueri sehingga rows sedekat mungkin dengan 1.

4. Extra (Informasi Tambahan)

Kolom Extra mencakup detail tambahan seperti operasi pengurutan atau penggunaan tabel temporer.

Extra ExampleMeaningOptimization Hint
Using temporaryTemporary table used (performance degradation)Review GROUP BY / ORDER BY
Using filesortManual sorting operation performedAdd index-based sorting
Using indexData retrieved using only the index (fast)○ Good state

Jika Anda melihat Using temporary atau Using filesort, Anda harus meninjau pernyataan SQL atau desain indeks Anda.

[Illustration] Contoh Output EXPLAIN

EXPLAIN SELECT * FROM users WHERE age > 30;
idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
1SIMPLEusersALLage_indexNULLNULLNULL5000Using where

Dalam contoh ini, meskipun indeks (age_index) ada, indeks tersebut tidak benar-benar digunakan, menghasilkan ALL (pemindaian tabel penuh). Ini menunjukkan adanya ruang untuk optimasi.

3. Belajar dengan Contoh: Cara Menggunakan EXPLAIN dan Menafsirkan Hasil

Contoh 1: Output EXPLAIN untuk Query SELECT Sederhana (Dengan Penjelasan)

Mari kita mulai dengan query SELECT sederhana pada satu tabel.

EXPLAIN SELECT * FROM users WHERE age > 30;

Anggap output EXPLAIN terlihat seperti ini:

idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
1SIMPLEusersALLageNULLNULLNULL5000Using where

Penjelasan:

  • type: ALL → Pemindaian seluruh tabel. Tidak ada indeks yang digunakan.
  • key: NULL → Tidak ada indeks yang sebenarnya digunakan.
  • rows: 5000 → MySQL memperkirakan akan memindai sekitar 5.000 baris.

Cara meningkatkan:

Dengan menambahkan indeks pada kolom age, Anda dapat secara signifikan meningkatkan kinerja query.

CREATE INDEX idx_age ON users(age);

Jika Anda menjalankan EXPLAIN lagi, Anda akan melihat type berubah menjadi range atau ref, yang mengonfirmasi bahwa indeks kini digunakan.

Contoh 2: Analisis Output EXPLAIN untuk Query dengan JOIN

Selanjutnya, mari kita lihat contoh yang melakukan JOIN pada beberapa tabel.

EXPLAIN
SELECT orders.id, users.name
FROM orders
JOIN users ON orders.user_id = users.id
WHERE users.age > 30;

Output contoh:

idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
1SIMPLEusersALLPRIMARY, ageNULLNULLNULL3000Using where
1SIMPLEordersrefuser_iduser_id4users.id5Using index

Penjelasan:

  • Tabel users melakukan pemindaian penuh ( ALL ), jadi ini bagian yang perlu ditingkatkan.
  • Sementara itu, tabel orders menggunakan indeks dengan ref, yang efisien.

Poin optimasi:

  • Menambahkan indeks pada users.age dapat mempercepat pemindaian tabel users.
  • Kuncinya adalah merancang indeks sehingga klausa WHERE dapat menyaring baris sebelum JOIN .

Ketika Indeks Tidak Digunakan (Contoh Buruk → Contoh Baik)

Contoh buruk: klausa WHERE menggunakan fungsi

SELECT * FROM users WHERE DATE(created_at) = '2024-01-01';

Dengan query seperti ini, indeks menjadi tidak dapat digunakan karena fungsi DATE() mengubah nilai kolom, mencegah MySQL menggunakan indeks secara efisien.

Contoh yang ditingkatkan: tentukan rentang tanpa menggunakan fungsi

SELECT * FROM users
WHERE created_at >= '2024-01-01' AND created_at < '2024-01-02';

Ini memungkinkan indeks pada kolom created_at, sehingga MySQL dapat mengambil data secara efisien.

Kesimpulan: Gunakan Contoh EXPLAIN Nyata untuk Mendiagnosa Kinerja

Dengan menganalisis output EXPLAIN pada query nyata, Anda dapat dengan jelas mengidentifikasi di mana bottleneck berada dan bagaimana mengoptimalkannya.

  • ALL → Pemindaian penuh. Pertimbangkan menambahkan atau menyesuaikan indeks.
  • key = NULL → Indeks tidak digunakan. Perlu penyelidikan.
  • Extra berisi Using temporary → Peringatan kinerja.
  • Menggunakan fungsi atau perhitungan dalam kondisi dapat menonaktifkan penggunaan indeks.

Menyimpan poin-poin ini dalam pikiran akan membantu Anda terus meningkatkan kinerja query dengan EXPLAIN.

4. Teknik Optimasi Query Praktis Berdasarkan Hasil EXPLAIN

Dasar-dasar Desain Indeks untuk Menghindari “type: ALL”

Jika EXPLAIN menunjukkan type: ALL, itu berarti MySQL melakukan pemindaian seluruh tabel. Ini adalah operasi yang sangat mahal, dan menjadi bottleneck utama untuk tabel yang berisi ribuan hingga jutaan baris.

Cara menghindarinya:

  • Tambahkan indeks pada kolom yang digunakan dalam klausa WHERE
    CREATE INDEX idx_age ON users(age);
    
  • Jika Anda memiliki beberapa kondisi, pertimbangkan indeks komposit
    CREATE INDEX idx_status_created ON orders(status, created_at);
    
  • Hindari pola LIKE yang tidak dimulai dengan awalan
    -- Bad example (index won’t work)
    WHERE name LIKE '%tanaka%'
    
    -- Good example (index may work)
    WHERE name LIKE 'tanaka%'
    

Apa Arti “Extra: Using temporary” dan Cara Memperbaikinya

Jika kolom Extra menampilkan “Using temporary”, itu berarti MySQL membuat tabel sementara secara internal untuk memproses query. Hal ini sering terjadi ketika operasi seperti GROUP BY atau ORDER BY tidak dapat ditangani hanya dengan indeks, sehingga MySQL harus menggunakan penyimpanan sementara untuk mengatur data secara manual.

Cara memperbaikinya:

  • Terapkan indeks pada kolom yang digunakan dalam GROUP BY dan ORDER BY
    CREATE INDEX idx_group_col ON sales(department_id);
    
  • Hapus sorting atau GROUP BY yang tidak perlu dari SQL Anda
  • Gunakan LIMIT atau subquery untuk mengurangi data target

Pahami Apa yang Dikatakan “rows” dan “key” untuk Meningkatkan Performa

Kolom rows menunjukkan berapa banyak baris yang diprediksi MySQL perlu dibaca dari tabel. Misalnya, sebuah query yang menampilkan rows = 100000 dapat berdampak signifikan pada performa.

Ketika nilai ini besar, Anda kemungkinan perlu menerapkan indeks yang mengurangi jumlah baris yang dipindai atau menulis ulang kondisi Anda.

Di sisi lain, kolom key menunjukkan indeks yang sebenarnya digunakan. Jika nilainya NULL, itu merupakan peringatan bahwa tidak ada indeks yang digunakan.

Daftar periksa optimasi:

  • Jika rows besar → Apakah filter Anda efektif? Apakah indeks digunakan dengan benar?
  • Jika key = NULL → Apakah Anda menggunakan pola di WHERE/JOIN yang mencegah penggunaan indeks?

Jadikan EXPLAIN dan Optimasi Kebiasaan

Untuk mengoptimalkan query secara efektif, pendekatan dasar adalah mengulang siklus ini: tulis → periksa dengan EXPLAIN → perbaiki → periksa lagi.

Ingat alur kerja ini:

  1. Tulis query secara normal
  2. Periksa rencana eksekusi dengan EXPLAIN
  3. Tinjau type, key, rows, dan Extra
  4. Jika ada bottleneck, revisi indeks atau tulis ulang query
  5. Jalankan EXPLAIN lagi untuk mengonfirmasi perbaikan

Performa query dipengaruhi tidak hanya oleh indeks tetapi juga oleh cara penulisan query itu sendiri. Perbandingan sederhana (bukan fungsi) dan kondisi yang langsung dapat menjadi sangat efektif.

5. Analisis Visual dengan MySQL Workbench Visual EXPLAIN

Periksa Rencana Eksekusi Secara Visual dengan Alat GUI

MySQL Workbench adalah alat GUI yang khusus untuk administrasi dan pengembangan MySQL. Salah satu keunggulannya adalah dapat menampilkan rencana eksekusi secara visual, yang sering sulit dibaca pada output terminal.

Dengan Visual EXPLAIN, Anda dapat meninjau informasi berikut dalam struktur pohon:

  • Urutan akses setiap tabel
  • Jenis JOIN yang digunakan
  • Status penggunaan indeks
  • Apakah terjadi pemindaian seluruh tabel
  • Operasi penyaringan dan pengurutan data

Karena rencana ditampilkan secara grafis, bahkan pemula dapat lebih mudah mengidentifikasi di mana bottleneck performa terjadi.

[With Images] Cara Menggunakan dan Membaca Visual EXPLAIN (Langkah demi Langkah)

Ikuti langkah-langkah berikut untuk menggunakan Visual EXPLAIN:

  1. Buka MySQL Workbench dan sambungkan ke basis data Anda → Pastikan koneksi telah dikonfigurasi sebelumnya.
  2. Masukkan query target Anda di editor SQL
    SELECT * FROM users WHERE age > 30;
    
  1. Klik ikon “EXPLAIN VISUAL” di sebelah tombol EXPLAIN → Atau klik kanan dan pilih “Visual Explain” dari menu.
  2. Rencana eksekusi akan ditampilkan secara visual Saat Anda mengklik setiap node (tabel), informasi detail seperti berikut akan muncul:
  • Metode akses (ALL, ref, range, dll.)
  • Indeks yang digunakan
  • Perkiraan baris (rows)
  • Kondisi filter dan metode JOIN

Catatan:
Dalam Visual EXPLAIN, warna dan ikon node membantu menyoroti operasi berat atau bagian yang tidak efisien.
Berikan perhatian khusus pada node yang disorot merah, karena biasanya menunjukkan masalah performa.

Bahkan Pemula Dapat Dengan Mudah Menemukan Bottleneck

Output EXPLAIN berbasis teks dapat terasa membingungkan pada awalnya, tetapi Visual EXPLAIN membuat area masalah menonjol secara visual.

Misalnya, menjadi lebih mudah mengidentifikasi:

  • Tabel yang menggunakan type: ALL
  • Blok query yang menunjukkan Using temporary
  • Pola dengan JOIN yang tidak perlu
  • Tabel yang indeksnya tidak digunakan

Dengan antarmuka GUI-nya, Anda dapat dengan cepat membentuk hipotesis optimasi, dan juga berguna untuk berbagi dan meninjau performa SQL dalam tim.

Visual EXPLAIN sangat berharga bagi pengguna SQL pemula hingga menengah.
Jika Anda tidak yakin cara menafsirkan hasil EXPLAIN, cobalah menggunakan fitur ini.

6. Pertanyaan yang Sering Diajukan (FAQ)

Q1. Kapan saya harus menggunakan EXPLAIN?

A. Anda harus menggunakan EXPLAIN setiap kali Anda merasa tidak yakin tentang kecepatan eksekusi sebuah query — terutama jika sebuah query “terasa lambat.” Ini juga berguna ketika Anda ingin memverifikasi apakah query yang baru dibuat menggunakan indeks dengan benar.

Dengan memeriksa rencana eksekusi sebelum deployment, Anda dapat mengidentifikasi risiko performa lebih awal.

Q2. Output menunjukkan type = ALL. Apa yang harus saya lakukan?

A. type: ALL berarti MySQL sedang melakukan pemindaian tabel penuh. Ini adalah operasi berbiaya tinggi dan dapat menurunkan performa secara signifikan, terutama pada tabel besar.

Pertimbangkan tindakan berikut:

  • Tambahkan indeks ke kolom yang digunakan dalam klausa WHERE
  • Hindari fungsi atau operasi yang menonaktifkan penggunaan indeks
  • Hindari SELECT * dan ambil hanya kolom yang diperlukan

Q3. Apakah “Using temporary” di kolom Extra merupakan masalah?

A. Using temporary menunjukkan bahwa MySQL secara internal membuat tabel sementara untuk memproses query. Ini sering terjadi dengan GROUP BY atau ORDER BY, dan dapat meningkatkan biaya memori serta I/O disk.

Solusi yang mungkin meliputi:

  • Tambahkan indeks ke kolom yang digunakan dalam GROUP BY / ORDER BY
  • Kurangi pengurutan atau agregasi yang tidak perlu
  • Gunakan LIMIT atau subquery untuk mengurangi kumpulan data

Q4. Bagaimana cara menggunakan Visual EXPLAIN?

A. Anda dapat menggunakan alat resmi MySQL “MySQL Workbench” untuk memvisualisasikan hasil EXPLAIN dengan mudah di GUI. Cukup masukkan query Anda dan klik tombol “Visual Explain”.

Ini sangat direkomendasikan untuk:

  • Pengguna yang merasa sulit membaca output EXPLAIN berbasis teks
  • Mereka yang ingin memahami JOIN kompleks secara visual
  • Tim yang meninjau performa SQL bersama-sama

Q5. Mengapa indeks saya tidak digunakan meskipun sudah ada?

A. Meskipun indeks ada, MySQL tidak selalu menggunakannya. Indeks mungkin diabaikan dalam kasus seperti:

  • Menggunakan fungsi atau ekspresi dalam klausa WHERE (misalnya, WHERE YEAR(created_at) = 2024 )
  • Kardinalitas rendah (distribusi nilai rendah), di mana pemindaian penuh dianggap lebih cepat
  • Urutan kolom tidak sesuai dengan definisi indeks komposit

Untuk memastikan apakah indeks digunakan dengan benar, selalu periksa kolom key di EXPLAIN.

7. Ringkasan: Gunakan EXPLAIN untuk Menemukan Peluang Optimasi SQL

Penyempurnaan performa di MySQL bukan hanya tentang menambahkan indeks.
Alat esensial untuk mengidentifikasi query mana yang menjadi bottleneck, mengapa lambat, dan bagaimana memperbaikinya adalah EXPLAIN.

Dalam artikel ini, kami membahas poin-poin kunci berikut:

✅ Peran dan Penggunaan Dasar EXPLAIN

  • Cukup tambahkan EXPLAIN sebelum query untuk memeriksa rencana eksekusinya
  • Masalah seperti pemindaian penuh (ALL) dan Using temporary menjadi terlihat

✅ Cara Membaca Kolom Output dan Mengevaluasi Performa

  • Empat kolom terpenting adalah type , key , rows , dan Extra
  • Hindari pemindaian tabel penuh dan bidik pemanfaatan indeks yang tepat
  • Waspadai saat melihat Using temporary atau Using filesort

✅ Diagnosis Praktis dan Optimasi Melalui Contoh Nyata

  • Bukan hanya menambahkan indeks, tetapi juga meningkatkan sintaks SQL penting
  • Bahkan query kompleks dengan JOIN atau subquery dapat dianalisis menggunakan EXPLAIN
  • Terus menyempurnakan query berdasarkan rencana eksekusi adalah cara tercepat untuk meningkatkan performa

✅ Gunakan Alat GUI untuk Konfirmasi Visual

  • Gunakan “Visual EXPLAIN” di MySQL Workbench untuk melihat rencana eksekusi secara grafis
  • Lebih mudah bagi pemula untuk mengidentifikasi bottleneck secara visual
  • Berguna untuk diskusi tim dan tinjauan performa SQL

✅ Cakupan FAQ untuk Skenario Dunia Nyata

  • Menjelaskan penyebab dan solusi untuk masalah seperti type=ALL dan key=NULL
  • Memberikan contoh mengapa indeks mungkin tidak digunakan

✍️ Jadikan EXPLAIN Kebiasaan untuk Meningkatkan Keterampilan SQL Anda

Jika Anda membangun kebiasaan memeriksa query dengan EXPLAIN setiap kali menulis SQL, Anda akan secara alami mulai menulis query yang lebih cepat dan efisien.

Ini bukan hanya trik teknis — ini bagian dari mengembangkan literasi SQL profesional.

  • Jalankan EXPLAIN segera setelah menulis query
  • Perbaiki rencana eksekusi yang mencurigakan secara langsung
  • Rancang indeks yang efisien dengan pertimbangan matang

Dengan menguasai siklus ini, keterampilan MySQL Anda akan terus meningkat.

Kami harap artikel ini menjadi langkah pertama Anda menuju optimasi query yang lebih baik.

Jika Anda memiliki pertanyaan atau ingin topik tambahan dibahas, silakan tinggalkan komentar!