Perintah EXPLAIN pada MySQL adalah instrumen diagnostik utama yang digunakan untuk menganalisis bagaimana mesin database mengeksekusi sebuah kueri (query execution plan). Dengan menambahkan kata kunci EXPLAIN di depan pernyataan SELECT, DELETE, INSERT, REPLACE, atau UPDATE, pengembang dapat melihat apakah kueri tersebut memanfaatkan indeks secara efisien atau melakukan pemindaian tabel penuh (Full Table Scan) yang membebani server.
Analisis yang tepat terhadap output EXPLAIN menghindarkan aplikasi dari latensi tinggi, penggunaan memori berlebih, dan beban CPU yang tidak perlu. Evaluasi berfokus pada kolom-kolom krusial seperti type, possible_keys, key, rows, dan Extra untuk mengidentifikasi titik hambatan (bottleneck) dalam skema relasional.
Struktur Kolom Output EXPLAIN MySQL
Saat perintah EXPLAIN dijalankan, MySQL mengembalikan satu set baris yang merinci langkah-langkah eksekusi. Berikut adalah rincian kolom penting beserta arti teknisnya:
| Nama Kolom | Deskripsi Teknis |
|---|---|
id |
Nomor urut langkah eksekusi kueri dalam pernyataan kompleks (subquery atau JOIN). |
select_type |
Jenis kueri SELECT (misal: SIMPLE, PRIMARY, SUBQUERY, DERIVED, UNION). |
table |
Nama tabel yang dirujuk oleh baris output tersebut. |
partitions |
Partisi tabel yang cocok untuk kueri (jika tabel menggunakan partisi). |
type |
Metode akses tabel (join type), mulai dari yang tercepat (system, const) hingga terlambat (ALL). |
possible_keys |
Indeks yang mungkin digunakan MySQL untuk menemukan baris pada tabel tersebut. |
key |
Indeks aktual yang benar-benar dipilih dan digunakan oleh MySQL. |
key_len |
Panjang (dalam byte) dari kunci yang dipilih oleh MySQL. |
ref |
Kolom atau konstanta yang dibandingkan dengan indeks untuk memilih baris. |
rows |
Estimasi jumlah baris yang harus diperiksa oleh MySQL untuk menyelesaikan eksekusi. |
filtered |
Persentase perkiraan baris yang disaring oleh kondisi tabel (table condition). |
Extra |
Informasi tambahan terkait resolusi kueri (misal: Using filesort, Using temporary, Using index). |
Analisis Nilai Kolom type (Join Type)
Kolom type adalah indikator performa paling krusial dalam analisis EXPLAIN. Nilai ini menunjukkan bagaimana tabel diakses. Berikut adalah urutan dari yang paling efisien hingga yang paling lambat:
- system / const: Kueri hanya mencocokkan satu baris per tabel (biasanya melalui pencarian Primary Key atau Unique Index). Sangat cepat.
- eq_ref: Digunakan untuk operasi JOIN di mana satu baris dari tabel sebelumnya dicocokkan dengan tepat satu baris indeks unik di tabel berikutnya.
- ref: Digunakan ketika indeks non-unik atau prefix dari indeks digunakan untuk pencarian baris.
- range: Pencarian dalam rentang tertentu menggunakan indeks (misalnya operator
BETWEEN,>,<, atauIN). - index: Mirip dengan Full Table Scan, tetapi hanya memindai pohon indeks (index tree) secara berurutan. Biasanya terjadi ketika seluruh kolom yang diminta tercakup dalam satu indeks (Covering Index).
- ALL: Full Table Scan penuh. MySQL harus membaca seluruh baris tabel dari awal sampai akhir tanpa memanfaatkan indeks. Ini adalah tanda bahaya utama bagi performa database.
Contoh Penggunaan SINTAKS EXPLAIN
Penerapan perintah EXPLAIN sangat sederhana. Cukup tambahkan kata kunci tersebut di depan kueri SQL yang ingin diuji:
-- Contoh kueri standar
SELECT u.username, o.order_date
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE u.status = 'active';
-- Cara menganalisisnya menggunakan EXPLAIN
EXPLAIN
SELECT u.username, o.order_date
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE u.status = 'active';
Untuk mendapatkan format output yang lebih terperinci dan mudah dibaca dalam bentuk hierarki JSON, gunakan perintah EXPLAIN FORMAT=JSON:
EXPLAIN FORMAT=JSON
SELECT u.username, o.order_date
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE u.status = 'active';
Mengenal Tanda Bahaya di Kolom Extra
Kolom Extra sering kali memberikan petunjuk spesifik mengenai operasi internal MySQL yang memakan banyak sumber daya. Beberapa catatan penting yang harus diwaspadai meliputi:
- Using filesort: MySQL harus melakukan langkah tambahan untuk mengurutkan data karena tidak dapat membaca data sesuai urutan indeks. Jika nilai ini muncul pada tabel besar, tambahkan indeks pada kolom yang diurutkan di klausul
ORDER BY. - Using temporary: MySQL terpaksa membuat tabel sementara (temporary table) di memori atau disk untuk menyimpan hasil sementara, biasanya terjadi pada kueri yang kompleks dengan
GROUP BYatauDISTINCTyang tidak terindeks dengan baik. - Using index: Merupakan tanda positif (Covering Index). Data diambil langsung dari indeks tanpa perlu mengakses tabel fisik.
- Using where: Menunjukkan bahwa klausul
WHEREdigunakan untuk menyaring baris setelah diambil dari penyimpanan.
Langkah-Langkah Perbaikan Troubleshooting Performa
Ketika hasil analisis EXPLAIN menunjukkan performa yang buruk, terapkan langkah-langkah teknis berikut:
- Identifikasi tabel yang memiliki nilai
type = ALLatau estimasirowsyang terlalu besar. - Periksa apakah kolom yang digunakan dalam klausul
WHERE,JOIN ON, atauORDER BYsudah memiliki indeks yang sesuai. - Buat indeks komposit (Composite Index) jika kueri memfilter berdasarkan beberapa kolom secara bersamaan, dengan memperhatikan urutan kolom (leftmost prefix rule).
- Jalankan perintah
ANALYZE TABLE nama_tabel;untuk memperbarui statistik distribusi data internal yang digunakan oleh optimizer MySQL.