- 1 1. Apa Itu MySQL EXPLAIN? Mengapa Anda Harus Menggunakannya?
- 2 2. Memahami Kolom Output EXPLAIN (Dengan Gambar Ilustrasi)
- 3 3. Belajar dengan Contoh: Cara Menggunakan EXPLAIN dan Menafsirkan Hasil
- 4 4. Teknik Optimasi Query Praktis Berdasarkan Hasil EXPLAIN
- 5 5. Analisis Visual dengan MySQL Workbench Visual EXPLAIN
- 6 6. Pertanyaan yang Sering Diajukan (FAQ)
- 7 7. Ringkasan: Gunakan EXPLAIN untuk Menemukan Peluang Optimasi SQL
- 7.1 ✅ Peran dan Penggunaan Dasar EXPLAIN
- 7.2 ✅ Cara Membaca Kolom Output dan Mengevaluasi Performa
- 7.3 ✅ Diagnosis Praktis dan Optimasi Melalui Contoh Nyata
- 7.4 ✅ Gunakan Alat GUI untuk Konfirmasi Visual
- 7.5 ✅ Cakupan FAQ untuk Skenario Dunia Nyata
- 7.6 ✍️ Jadikan EXPLAIN Kebiasaan untuk Meningkatkan Keterampilan SQL Anda
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 Name | Description |
|---|---|
| id | Identifier indicating execution order or grouping within the query |
| select_type | The type of SELECT (e.g., subquery, UNION) |
| table | Name of the table being accessed |
| type | Join type (access method) |
| possible_keys | Possible indexes that could be used |
| key | Actual index used |
| key_len | Length of the used index (in bytes) |
| ref | Value compared against the index |
| rows | Estimated number of rows MySQL expects to scan |
| Extra | Additional 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 Value | Meaning | Performance Level |
|---|---|---|
| ALL | Full table scan | ✕ Slow |
| index | Full index scan | △ Moderate |
| range | Range scan | ○ Good |
| ref / eq_ref | Index lookup | ◎ Excellent |
| const / system | Single-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 Example | Meaning | Optimization Hint |
|---|---|---|
| Using temporary | Temporary table used (performance degradation) | Review GROUP BY / ORDER BY |
| Using filesort | Manual sorting operation performed | Add index-based sorting |
| Using index | Data 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;
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
|---|---|---|---|---|---|---|---|---|---|
| 1 | SIMPLE | users | ALL | age_index | NULL | NULL | NULL | 5000 | Using 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:
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
|---|---|---|---|---|---|---|---|---|---|
| 1 | SIMPLE | users | ALL | age | NULL | NULL | NULL | 5000 | Using 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:
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
|---|---|---|---|---|---|---|---|---|---|
| 1 | SIMPLE | users | ALL | PRIMARY, age | NULL | NULL | NULL | 3000 | Using where |
| 1 | SIMPLE | orders | ref | user_id | user_id | 4 | users.id | 5 | Using index |
Penjelasan:
- Tabel
usersmelakukan pemindaian penuh (ALL), jadi ini bagian yang perlu ditingkatkan. - Sementara itu, tabel
ordersmenggunakan indeks denganref, yang efisien.
Poin optimasi:
- Menambahkan indeks pada
users.agedapat mempercepat pemindaian tabelusers. - 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.ExtraberisiUsing 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
rowsbesar → 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:
- Tulis query secara normal
- Periksa rencana eksekusi dengan
EXPLAIN - Tinjau
type,key,rows, danExtra - Jika ada bottleneck, revisi indeks atau tulis ulang query
- Jalankan
EXPLAINlagi 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:
- Buka MySQL Workbench dan sambungkan ke basis data Anda → Pastikan koneksi telah dikonfigurasi sebelumnya.
- Masukkan query target Anda di editor SQL
SELECT * FROM users WHERE age > 30;
- Klik ikon “EXPLAIN VISUAL” di sebelah tombol EXPLAIN → Atau klik kanan dan pilih “Visual Explain” dari menu.
- 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
EXPLAINsebelum 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, danExtra - 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!


