Strategi optimasi query dan analisis execution plan
Berikut adalah lanjutan dari **Modul 7: Indeks dan Optimasi Kinerja Query**, dengan fokus pada **strategi optimasi query** dan **analisis execution plan**, dilengkapi dengan **contoh penerapan di MySQL Ubuntu 24.04**.
---
- 🧠 **Modul 7 (Lanjutan): Indeks dan Optimasi Kinerja Query**
- 🎯 **Tujuan Pembelajaran**
Setelah mempelajari modul ini, mahasiswa diharapkan mampu: - Menganalisis performa query menggunakan **EXPLAIN**. - Menyusun strategi optimasi query. - Menggunakan indeks dan teknik penulisan query untuk mempercepat eksekusi.
---
- ⚡ **7.5 Apa Itu Optimasi Query?**
- Optimasi Query** adalah proses penyusunan dan perbaikan perintah SQL agar berjalan lebih efisien, baik dari sisi waktu eksekusi maupun penggunaan sumber daya.
---
- 🧩 **7.6 Analisis Query dengan EXPLAIN**
- ✅ **EXPLAIN** menunjukkan cara MySQL merencanakan dan mengeksekusi query.
```sql EXPLAIN SELECT * FROM mahasiswa WHERE nama = 'Andi'; ```
- 🧾 Contoh Output:
| id | select_type | table | type | possible_keys | key | rows | Extra | |----|-------------|-----------|--------|----------------|--------|------|-------------| | 1 | SIMPLE | mahasiswa | ref | nama | nama | 1 | Using index |
> Gunakan `EXPLAIN ANALYZE` (MySQL 8+) untuk analisis yang lebih rinci.
---
- 🔍 **7.7 Strategi Optimasi Query**
- 🧠 1. **Gunakan SELECT Kolom Spesifik, Bukan SELECT ***:
```sql -- Kurang efisien SELECT * FROM mahasiswa;
-- Lebih efisien SELECT nim, nama FROM mahasiswa; ```
---
- 🧠 2. **Gunakan Indeks pada Kolom WHERE atau JOIN**
```sql -- Menambahkan indeks untuk kolom yang sering dicari CREATE INDEX idx_nama ON mahasiswa(nama); ```
---
- 🧠 3. **Gunakan LIMIT untuk Batasi Data**
```sql SELECT * FROM mahasiswa ORDER BY nama LIMIT 10; ```
---
- 🧠 4. **Hindari Fungsi di Kolom WHERE**
```sql -- Kurang efisien karena fungsi dijalankan per baris SELECT * FROM mahasiswa WHERE YEAR(tanggal_lahir) = 2000;
-- Lebih efisien SELECT * FROM mahasiswa WHERE tanggal_lahir BETWEEN '2000-01-01' AND '2000-12-31'; ```
---
- 🧠 5. **Gunakan JOIN daripada Subquery jika memungkinkan**
```sql -- Subquery (kurang efisien jika tidak ada indeks) SELECT nama FROM mahasiswa WHERE nim IN (
SELECT nim FROM pengambilan WHERE kode_mk = 'MK001'
);
-- JOIN (lebih efisien jika ada index di pengambilan.nim) SELECT m.nama FROM mahasiswa m JOIN pengambilan p ON m.nim = p.nim WHERE p.kode_mk = 'MK001'; ```
---
- 🔎 **7.8 Studi Kasus: Bandingkan Kinerja Query**
- 👎 Query 1 (Tanpa Indeks)
```sql SELECT * FROM mahasiswa WHERE nama = 'Andi'; -- EXPLAIN menunjukkan "type: ALL" = full table scan ```
- 👍 Query 2 (Dengan Indeks)
```sql CREATE INDEX idx_nama ON mahasiswa(nama);
SELECT * FROM mahasiswa WHERE nama = 'Andi'; -- EXPLAIN menunjukkan "type: ref", "key: idx_nama" ```
---
- 🛠 **7.9 Tools Tambahan untuk Optimasi di Ubuntu**
1. **EXPLAIN** dan **EXPLAIN ANALYZE** 2. **Performance Schema** (aktifkan di `/etc/mysql/mysql.conf.d/mysqld.cnf`) 3. **MySQL Tuner** (command-line tool)
```bash sudo apt install mysqltuner sudo mysqltuner ```
---
- 📌 **7.10 Kesimpulan**
- Gunakan **EXPLAIN** untuk melihat bagaimana query dijalankan oleh MySQL. - Gunakan **indeks** pada kolom yang sering digunakan dalam WHERE, JOIN, atau ORDER BY. - Hindari `SELECT *`, fungsi di kolom WHERE, dan subquery tidak efisien. - Kombinasi indeks + penulisan query yang benar bisa meningkatkan performa hingga 10x lipat atau lebih.
---
Kalau kamu mau saya bantu buat **latihan soal optimasi query + pembahasan**, atau simulasi benchmark perbandingan dengan waktu eksekusi, tinggal bilang ya!