Strategi optimasi query dan analisis execution plan

From OnnoWiki
Jump to navigation Jump to search

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**.

---

    1. 🧠 **Modul 7 (Lanjutan): Indeks dan Optimasi Kinerja Query**
      1. 🎯 **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.

---

    1. ⚡ **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.

---

    1. 🧩 **7.6 Analisis Query dengan EXPLAIN**
      1. ✅ **EXPLAIN** menunjukkan cara MySQL merencanakan dan mengeksekusi query.

```sql EXPLAIN SELECT * FROM mahasiswa WHERE nama = 'Andi'; ```

      1. 🧾 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.

---

    1. 🔍 **7.7 Strategi Optimasi Query**
      1. 🧠 1. **Gunakan SELECT Kolom Spesifik, Bukan SELECT ***:

```sql -- Kurang efisien SELECT * FROM mahasiswa;

-- Lebih efisien SELECT nim, nama FROM mahasiswa; ```

---

      1. 🧠 2. **Gunakan Indeks pada Kolom WHERE atau JOIN**

```sql -- Menambahkan indeks untuk kolom yang sering dicari CREATE INDEX idx_nama ON mahasiswa(nama); ```

---

      1. 🧠 3. **Gunakan LIMIT untuk Batasi Data**

```sql SELECT * FROM mahasiswa ORDER BY nama LIMIT 10; ```

---

      1. 🧠 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'; ```

---

      1. 🧠 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'; ```

---

    1. 🔎 **7.8 Studi Kasus: Bandingkan Kinerja Query**
      1. 👎 Query 1 (Tanpa Indeks)

```sql SELECT * FROM mahasiswa WHERE nama = 'Andi'; -- EXPLAIN menunjukkan "type: ALL" = full table scan ```

      1. 👍 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" ```

---

    1. 🛠 **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 ```

---

    1. 📌 **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!