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 *...")
 
 
(One intermediate revision by the same user not shown)
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.
 +
 
 +
 
  
---
+
==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.
  
## 🧠 **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.
 
  
---
+
==Analisis Query dengan EXPLAIN==
  
## ⚡ **7.5 Apa Itu Optimasi Query?**
+
'''EXPLAIN''' menunjukkan cara MySQL merencanakan dan mengeksekusi query.
  
**Optimasi Query** adalah proses penyusunan dan perbaikan perintah SQL agar berjalan lebih efisien, baik dari sisi waktu eksekusi maupun penggunaan sumber daya.
+
EXPLAIN SELECT * FROM mahasiswa WHERE nama = 'Andi';
  
---
+
Contoh Output:
  
## 🧩 **7.6 Analisis Query dengan EXPLAIN**
+
{| class="wikitable"
 +
! id !! select_type !! table    !! type  !! possible_keys !! key  !! rows !! Extra
 +
|-
 +
| 1  || SIMPLE      || mahasiswa || ref    || nama          || nama  || 1    ||| Using index
 +
|}
  
### ✅ **EXPLAIN** menunjukkan cara MySQL merencanakan dan mengeksekusi query.
+
> Gunakan `EXPLAIN ANALYZE` (MySQL 8+) untuk analisis yang lebih rinci.
  
```sql
+
==Strategi Optimasi Query==
EXPLAIN SELECT * FROM mahasiswa WHERE nama = 'Andi';
 
```
 
  
### 🧾 Contoh Output:
+
Gunakan SELECT Kolom Spesifik, Bukan SELECT *:
  
| id | select_type | table    | type  | possible_keys | key  | rows | Extra      |
+
--- Kurang efisien
|----|-------------|-----------|--------|----------------|--------|------|-------------|
+
  SELECT * FROM mahasiswa;
| 1 | SIMPLE      | mahasiswa | ref    | nama          | nama  | 1    | Using index |
 
  
> Gunakan `EXPLAIN ANALYZE` (MySQL 8+) untuk analisis yang lebih rinci.
+
--- Lebih efisien
 +
SELECT nim, nama FROM mahasiswa;
  
---
 
  
## 🔍 **7.7 Strategi Optimasi Query**
+
==Gunakan Indeks pada Kolom WHERE atau JOIN==
  
### 🧠 1. **Gunakan SELECT Kolom Spesifik, Bukan SELECT ***:
+
--- 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]]

Latest revision as of 06:50, 21 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