Difference between revisions of "Strategi optimasi query dan analisis execution plan"

From OnnoWiki
Jump to navigation Jump to search
(Created page with "Berikut adalah lanjutan dari **Modul 7: Indeks dan Optimasi Kinerja Query**, dengan fokus pada **strategi optimasi query** dan **analisis execution plan**, dilengkapi dengan *...")
 
Line 1: Line 1:
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**.
+
==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.
  
---
 
  
## 🧠 **Modul 7 (Lanjutan): Indeks dan Optimasi Kinerja Query**
 
  
### 🎯 **Tujuan Pembelajaran**
+
==Apa Itu Optimasi Query?==
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.
 
  
---
+
Optimasi Query adalah proses penyusunan dan perbaikan perintah SQL agar berjalan lebih efisien, baik dari sisi waktu eksekusi maupun penggunaan sumber daya.
  
## ⚡ **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.
 
  
---
+
==Analisis Query dengan EXPLAIN==
  
## 🧩 **7.6 Analisis Query dengan EXPLAIN**
+
'''EXPLAIN''' menunjukkan cara MySQL merencanakan dan mengeksekusi query.
  
### ✅ **EXPLAIN** menunjukkan cara MySQL merencanakan dan mengeksekusi query.
+
EXPLAIN SELECT * FROM mahasiswa WHERE nama = 'Andi';
  
```sql
+
Contoh Output:
EXPLAIN SELECT * FROM mahasiswa WHERE nama = 'Andi';
 
```
 
 
 
### 🧾 Contoh Output:
 
  
 
| id | select_type | table    | type  | possible_keys | key  | rows | Extra      |
 
| id | select_type | table    | type  | possible_keys | key  | rows | Extra      |
|----|-------------|-----------|--------|----------------|--------|------|-------------|
+
|-|-|--|--|-|--||-|
 
| 1  | SIMPLE      | mahasiswa | ref    | nama          | nama  | 1    | Using index |
 
| 1  | SIMPLE      | mahasiswa | ref    | nama          | nama  | 1    | Using index |
  
 
> Gunakan `EXPLAIN ANALYZE` (MySQL 8+) untuk analisis yang lebih rinci.
 
> Gunakan `EXPLAIN ANALYZE` (MySQL 8+) untuk analisis yang lebih rinci.
  
---
 
  
## 🔍 **7.7 Strategi Optimasi Query**
 
  
### 🧠 1. **Gunakan SELECT Kolom Spesifik, Bukan SELECT ***:
+
==Strategi Optimasi Query==
 +
 
 +
Gunakan SELECT Kolom Spesifik, Bukan SELECT *:
 +
 
 +
--- Kurang efisien
 +
SELECT * FROM mahasiswa;
 +
 
 +
--- Lebih efisien
 +
SELECT nim, nama FROM mahasiswa;
 +
 
 +
 
 +
==Gunakan Indeks pada Kolom WHERE atau JOIN==
 +
 
 +
--- Menambahkan indeks untuk kolom yang sering dicari
 +
CREATE INDEX idx_nama ON mahasiswa(nama);
  
```sql
 
-- Kurang efisien
 
SELECT * FROM mahasiswa;
 
  
-- Lebih efisien
 
SELECT nim, nama FROM mahasiswa;
 
```
 
  
---
 
  
### 🧠 2. **Gunakan Indeks pada Kolom WHERE atau JOIN**
+
==Gunakan LIMIT untuk Batasi Data==
  
```sql
+
SELECT * FROM mahasiswa ORDER BY nama LIMIT 10;
-- Menambahkan indeks untuk kolom yang sering dicari
 
CREATE INDEX idx_nama ON mahasiswa(nama);
 
```
 
  
---
 
  
### 🧠 3. **Gunakan LIMIT untuk Batasi Data**
+
==Hindari Fungsi di Kolom WHERE==
  
```sql
+
--- Kurang efisien karena fungsi dijalankan per baris
SELECT * FROM mahasiswa ORDER BY nama LIMIT 10;
+
SELECT * FROM mahasiswa WHERE YEAR(tanggal_lahir) = 2000;
```
 
  
---
+
--- Lebih efisien
 +
SELECT * FROM mahasiswa WHERE tanggal_lahir BETWEEN '2000-01-01' AND '2000-12-31';
  
### 🧠 4. **Hindari Fungsi di Kolom WHERE**
 
  
```sql
 
-- Kurang efisien karena fungsi dijalankan per baris
 
SELECT * FROM mahasiswa WHERE YEAR(tanggal_lahir) = 2000;
 
  
-- Lebih efisien
+
==Gunakan JOIN daripada Subquery jika memungkinka==
SELECT * FROM mahasiswa WHERE tanggal_lahir BETWEEN '2000-01-01' AND '2000-12-31';
 
```
 
  
---
+
--- Subquery (kurang efisien jika tidak ada indeks)
 +
SELECT nama FROM mahasiswa WHERE nim IN (
 +
  SELECT nim FROM pengambilan WHERE kode_mk = 'MK001'
 +
);
  
### 🧠 5. **Gunakan JOIN daripada Subquery jika memungkinkan**
+
--- 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';
  
```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)
+
==Studi Kasus: Bandingkan Kinerja Query==
SELECT m.nama
 
FROM mahasiswa m
 
JOIN pengambilan p ON m.nim = p.nim
 
WHERE p.kode_mk = 'MK001';
 
```
 
  
---
+
'''Query 1 (Tanpa Indeks)'''
  
## 🔎 **7.8 Studi Kasus: Bandingkan Kinerja Query**
+
SELECT * FROM mahasiswa WHERE nama = 'Andi';
 +
--- EXPLAIN menunjukkan "type: ALL" = full table scan
  
### 👎 Query 1 (Tanpa Indeks)
+
'''Query 2 (Dengan Indeks)'''
  
```sql
+
CREATE INDEX idx_nama ON mahasiswa(nama);
SELECT * FROM mahasiswa WHERE nama = 'Andi';
+
-- EXPLAIN menunjukkan "type: ALL" = full table scan
+
SELECT * FROM mahasiswa WHERE nama = 'Andi';
```
+
--- EXPLAIN menunjukkan "type: ref", "key: idx_nama"
  
### 👍 Query 2 (Dengan Indeks)
 
  
```sql
 
CREATE INDEX idx_nama ON mahasiswa(nama);
 
  
SELECT * FROM mahasiswa WHERE nama = 'Andi';
+
==Tools Tambahan untuk Optimasi di Ubuntu==
-- EXPLAIN menunjukkan "type: ref", "key: idx_nama"
 
```
 
  
---
+
* EXPLAIN dan EXPLAIN ANALYZE 
 +
* Performance Schema (aktifkan di `/etc/mysql/mysql.conf.d/mysqld.cnf`) 
 +
* MySQL Tuner (command-line tool)
  
## 🛠 **7.9 Tools Tambahan untuk Optimasi di Ubuntu**
 
  
1. **EXPLAIN** dan **EXPLAIN ANALYZE**  
+
  sudo apt install mysqltuner
2. **Performance Schema** (aktifkan di `/etc/mysql/mysql.conf.d/mysqld.cnf`)  
+
  sudo mysqltuner
3. **MySQL Tuner** (command-line tool)
 
  
```bash
 
sudo apt install mysqltuner
 
sudo mysqltuner
 
```
 
  
---
+
==Kesimpulan==
  
## 📌 **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.
  
- 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.
 
  
---
+
==Pranala Menarik==
  
Kalau kamu mau saya bantu buat **latihan soal optimasi query + pembahasan**, atau simulasi benchmark perbandingan dengan waktu eksekusi, tinggal bilang ya!
+
* [[Database: Kuliah]]

Revision as of 16:32, 20 April 2025

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.


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.


Analisis Query dengan EXPLAIN

EXPLAIN menunjukkan cara MySQL merencanakan dan mengeksekusi query.

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.


Strategi Optimasi Query

Gunakan SELECT Kolom Spesifik, Bukan SELECT *:

--- Kurang efisien
SELECT * FROM mahasiswa;
--- Lebih efisien
SELECT nim, nama FROM mahasiswa;


Gunakan Indeks pada Kolom WHERE atau JOIN

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



Gunakan LIMIT untuk Batasi Data

SELECT * FROM mahasiswa ORDER BY nama LIMIT 10;


Hindari Fungsi di Kolom WHERE

--- 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';


Gunakan JOIN daripada Subquery jika memungkinka

--- 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';


Studi Kasus: Bandingkan Kinerja Query

Query 1 (Tanpa Indeks)

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

Query 2 (Dengan Indeks)

CREATE INDEX idx_nama ON mahasiswa(nama);

SELECT * FROM mahasiswa WHERE nama = 'Andi';
--- EXPLAIN menunjukkan "type: ref", "key: idx_nama"


Tools Tambahan untuk Optimasi di Ubuntu

  • EXPLAIN dan EXPLAIN ANALYZE
  • Performance Schema (aktifkan di `/etc/mysql/mysql.conf.d/mysqld.cnf`)
  • MySQL Tuner (command-line tool)


sudo apt install mysqltuner
sudo mysqltuner


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.


Pranala Menarik