Analisis EXPLAIN MySQL: Cara Membaca Query Plan dan Optimasi

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, >, <, atau IN).
  • 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 BY atau DISTINCT yang 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 WHERE digunakan 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:

  1. Identifikasi tabel yang memiliki nilai type = ALL atau estimasi rows yang terlalu besar.
  2. Periksa apakah kolom yang digunakan dalam klausul WHERE, JOIN ON, atau ORDER BY sudah memiliki indeks yang sesuai.
  3. Buat indeks komposit (Composite Index) jika kueri memfilter berdasarkan beberapa kolom secara bersamaan, dengan memperhatikan urutan kolom (leftmost prefix rule).
  4. Jalankan perintah ANALYZE TABLE nama_tabel; untuk memperbarui statistik distribusi data internal yang digunakan oleh optimizer MySQL.