# Hanya 20 baris, tapi memindai satu juta baris? Tutorial Lengkap Optimasi Kinerja SQL
## I. Judul
Hanya 20 baris, tapi memindai satu juta baris? Tutorial Lengkap Optimasi Kinerja SQL
Alternatif:
- Mengembalikan 20 baris, memindai satu juta baris: Penjelasan mendalam tentang optimasi SQL
- Ada indeks tapi sengaja tidak dipakai? Pahami EXPLAIN sebelum mulai mengubah
- Paginasi mendalam (Deep Pagination) LIMIT satu juta: Mengapa semakin dibalik semakin lambat
- Mesin tidak rusak, indeks juga ada, kelambatan terjadi karena SQL ini melakukan terlalu banyak pekerjaan sia-sia
## II. Deskripsi
Daftar pesanan biasanya memakan waktu 80 milidetik, tetapi ketika pengguna beralih ke halaman yang sangat jauh di belakang, mereka harus menunggu lebih dari dua detik.
Kedua angka dalam log kueri lambat tidak cocok: Rows_sent adalah 20, Rows_examined adalah 1000020—
Untuk memberikan 20 baris ini kepada Anda, basis data terlebih dahulu membaca satu juta baris di depan satu per satu, lalu membuangnya.
Mesin tidak rusak, indeks juga ada. Kelambatan terjadi karena SQL ini membuat basis data melakukan terlalu banyak pekerjaan sia-sia.
Inti dari optimasi SQL sebenarnya hanya satu hal: membuat basis data membaca lebih sedikit baris dan mengambil lebih sedikit langkah.
Video ini mengikuti urutan pemecahan masalah: temukan dulu SQL lambat, gunakan EXPLAIN untuk melihat rencana eksekusi,
kemudian uraikan jenis-jenis masalah umum seperti indeks, paginasi, pengurutan, penggabungan (join), dan lapisan aplikasi, serta berikan solusi modifikasi untuk setiap jenis.
✅ Anda akan memahami:
· Log kueri lambat + pt-query-digest: Penghematan waktu terbanyak sering kali berasal dari kueri "200 milidetik setiap kali, satu juta kali sehari"
· Di mana waktu kueri dihabiskan: Halaman, buffer pool, pembacaan sekuensial vs pembacaan acak
· Memahami EXPLAIN: type / key / rows / Extra, serta EXPLAIN ANALYZE untuk melihat waktu aktual yang dihabiskan
· Pohon B+ (B+ Tree), table lookup (hui biao), dan indeks penutup (covering index): Jangan menulis SELECT * sembarangan
· Indeks gabungan (Composite Index): Prefiks kiri (left prefix), pemotongan rentang; kesetaraan di depan, rentang di belakang
· Empat cara membuat indeks tidak valid: Fungsi yang membungkus kolom, konversi tipe implisit, wildcard kiri (left fuzzy), OR
· Kontraintuitif: Optimizer lebih memilih pemindaian seluruh tabel (full table scan) — ketika terlalu banyak table lookup, pembacaan acak lebih mahal daripada pemindaian sekuensial
· Paginasi mendalam: Paginasi kursor dan delayed join, jangan gunakan LIMIT satu juta lagi
· filesort / tabel sementara: Sesuaikan pengurutan dan pengelompokan dengan urutan indeks
· JOIN dan COUNT: Kolom penggabungan harus memiliki indeks; COUNT(*) InnoDB dihitung di tempat
· Tiga jebakan lapisan aplikasi: N+1, penyisipan baris demi baris, transaksi panjang
⏱ Garis waktu bab (dapat diklik untuk melompat)
00:00 Pendahuluan: Hanya 20 baris, tapi memindai satu juta baris
01:09 Temukan SQL lambat terlebih dahulu
02:29 Sisipan: Duokewang
03:15 Di mana waktu kueri dihabiskan
04:30 Memahami EXPLAIN
05:51 Pohon B+, table lookup, dan indeks penutup
07:05 Indeks gabungan: Prefiks kiri dan pemotongan rentang
08:17 Empat cara membuat indeks tidak valid
09:37 Kontraintuitif: Ada indeks, tapi sengaja tidak dipakai
10:53 Paginasi mendalam: LIMIT satu juta
12:12 Pengurutan dan pengelompokan: filesort dan tabel sementara
13:37 JOIN dan COUNT
15:06 Tiga jebakan lapisan aplikasi
16:29 Daftar periksa pemecahan masalah dan penutup
Durasi video sekitar 17:44. Duokewang: https://duoke360.com/
Cocok untuk: Pengembang backend yang pernah menulis SQL dan terjebak oleh kueri lambat online, serta peserta wawancara yang ditanya tentang indeks, EXPLAIN, dan paginasi mendalam.
Tidak perlu membaca kode sumber kernel MySQL, cukup tahu cara membaca log lambat untuk bisa mengikuti.
Ringkasan satu kalimat: Buat basis data membaca lebih sedikit baris dan mengambil lebih sedikit langkah;
Setiap modifikasi didasarkan pada angka dari EXPLAIN.
Jika menurut Anda ini berguna, dukung dengan triple-thump (like, coin, favorite)~ Silakan tinggalkan pertanyaan di kolom komentar untuk diskusi.
## III. Tag Tag
#OptimasiSQL #MySQL #KueriLambat #EXPLAIN #Indeks #PohonB+ #PaginasiMendalam #IndeksPenutup #IndeksGabungan #filesort #PengembanganBackend #BasisData #Wawancara #TutorialPemrograman #InnoDB #pt-query-digest
---
## IV. Kata Kunci
Optimasi SQL, Kinerja MySQL, Kueri lambat, slow_query_log, pt-query-digest,
EXPLAIN, EXPLAIN ANALYZE, type ALL, Using filesort, Using temporary,
Pohon B+, Indeks Klaster, Table lookup, Indeks penutup, Using index,
Indeks gabungan, Prefiks kiri, Pemotongan rentang, Index Condition Pushdown,
Indeks tidak valid, Konversi tipe implisit, Wildcard kiri LIKE, FORCE INDEX, ANALYZE TABLE,
Paginasi mendalam, LIMIT OFFSET, Paginasi kursor, Delayed join,
filesort, sort_buffer, Tabel sementara, GROUP BY,
JOIN, Nested loop, Hash join, COUNT(*), N+1, Transaksi panjang, InnoDB buffer pool