Pengoptimalan Kueri SQL: Baca Rencana Eksekusi dan Perbaiki Kueri Lambat, Dengan Pengaturan Waktu
Berhentilah menebak mengapa kueri lambat. Belajar membaca rencana eksekusi, lalu terapkan perbaikan yang paling penting, dengan pengukuran sebelum dan sesudah dari tabel nyata yang terdiri dari satu juta baris.
- Mulailah dengan rencana eksekusi. Ini memberi tahu Anda apa yang sebenarnya dilakukan database.
- Cari pemindaian penuh pada tabel besar, lalu tambahkan indeks yang cocok dengan filter Anda dan gabung.
- Hindari menggabungkan kolom yang diindeks ke dalam suatu fungsi, karena hal ini dapat menghentikan penggunaan indeks yang efisien.
- Ukur sebelum dan sesudahnya, karena setiap database dan kumpulan data berperilaku berbeda.
Kueri yang memerlukan waktu milidetik pada tahun lalu dapat memerlukan waktu beberapa menit saat ini, hanya karena tabelnya bertambah. Pengoptimalan kueri SQL bukan tentang trik cerdas dan lebih banyak tentang proses yang berulang: cari tahu apa yang dilakukan database, hapus pekerjaan yang terbuang, dan periksa apakah itu membantu.
Kami menguji setiap teknik di bawah ini pada satu juta baris yang dihasilkan di SQLite 3.50. Pengaturan waktu adalah yang terbaik dari beberapa proses yang dijalankan dari satu laptop, menggunakan database dalam memori. Mereka tidak akan cocok dengan sistem Anda, dan PostgreSQL, MySQL, dan SQL Server masing-masing memiliki pengoptimal dan format paketnya sendiri. Fokus pada ukuran setiap perbaikan dan prinsip di baliknya.
Sekilas tentang hasil
| Teknik | Sebelumnya | Setelah |
|---|---|---|
| Indeks pada kolom filter | 73 ms | 0,01 ms |
| Rentang, bukan fungsi pada kolom | 96 mdtk | 33 ms |
| Indeks komposit untuk dua filter | 19 ms | 2,2 ms |
| Keyset daripada OFFSET yang dalam | 8,1 ms | 0,01 ms |
Pengaturan tes
CREATE TABLE customers (
id INTEGER PRIMARY KEY, name TEXT, city TEXT
);
CREATE TABLE orders (
id INTEGER PRIMARY KEY, customer_id INT, status TEXT,
created TEXT, total INT, note TEXT
);
-- 50,000 customers and 1,000,000 orders with random values
Proses optimasi sederhana
- Temukan kueri yang penting. Gunakan log atau pemantauan kueri yang lambat. Kueri 200 ms yang dijalankan seribu kali per menit mungkin lebih penting daripada laporan bulanan 10 detik.
- Baca rencananya. Lihat apa yang sebenarnya dilakukan database.
- Ubah satu hal. Tambahkan indeks atau tulis ulang bagian kueri.
- Ukur lagi, pada data realistis. Rencana untuk 100 baris pengujian memberi tahu Anda sedikit tentang satu juta.
- Perhatikan seiring berjalannya waktu. Rencana dapat berubah seiring bertambahnya data dan perubahan statistik.
Baca rencana eksekusi
Rencana eksekusi adalah strategi langkah demi langkah database untuk menjalankan kueri, termasuk indeks mana yang digunakan dan urutan penggabungan tabel. Awali kueri untuk melihatnya:
| Basis data | Perintah |
|---|---|
| SQLite | JELASKAN PILIHAN RENCANA QUERY... |
| PostgreSQL | JELASKAN ANALISIS PILIHAN... |
| MySQL | EXPLAIN SELECT ..., atau EXPLAIN ANALYZE |
| SQLServer | Rencana Eksekusi Aktual di SSMS |
Perhatikan bahwa EXPLAIN ANALYZE di PostgreSQL benar-benar menjalankan kueri, jadi berhati-hatilah saat menggunakannya dengan UPDATE atau DELETE. Inilah yang harus dicari terlebih dahulu:
| Anda lihat | Artinya | Biasanya |
|---|---|---|
| Pindai atau Seq Pindai | Membaca seluruh tabel | Kekhawatiran pada tabel besar |
| Pencarian atau Pencarian Indeks | Melompat ke baris yang cocok | Bagus |
| Meliputi indeks | Dijawab dari indeks saja | Sangat bagus |
| Temp B-tree atau Sortir | Pekerjaan penyortiran ekstra | Layak untuk diperiksa |
Pemindaian penuh tidak otomatis buruk. Jika kueri memerlukan sebagian besar tabel kecil, pemindaian bisa menjadi pilihan tercepat. Di EXPLAIN ANALYZE PostgreSQL, bandingkan juga baris perkiraan dengan baris sebenarnya. Perbedaan besar sering kali berarti statistik tabel sudah ketinggalan zaman.
Tambahkan indeks yang tepat
Kueri ini menemukan pesanan satu pelanggan:
SELECT id, total FROM orders WHERE customer_id = 123;
Sebelum menambahkan indeks, rencananya adalah pemindaian penuh:
SCAN orders
-- 20 rows in 73 ms
Kemudian kami menambahkan indeks pada kolom filter:
CREATE INDEX idx_orders_customer ON orders(customer_id);
SEARCH orders USING INDEX idx_orders_customer (customer_id=?)
-- 20 rows in 0.01 ms
20 baris yang sama muncul ribuan kali lebih cepat, karena database tidak lagi membaca satu juta baris untuk menemukannya. Tidak ada teknik lain dalam artikel ini yang memberi kami kemenangan lebih besar. Kandidat pertama yang baik adalah kolom yang digunakan di WHERE, JOIN dan ORDER BY, terutama ketika kolom tersebut mempersempit hasilnya menjadi beberapa baris. Panduan kami untuk indeks SQL menjelaskan cara kerjanya.
Jangan bungkus kolom yang diindeks dalam fungsi
Berikut dua cara untuk menemukan pesanan bulan Maret, dengan indeks pada created:
-- Function on the column
SELECT id FROM orders WHERE substr(created, 1, 7) = '2026-03';
-- SCAN orders USING COVERING INDEX idx_orders_created
-- 84,961 rows in 96 ms
-- Plain range
SELECT id FROM orders
WHERE created >= '2026-03-01' AND created < '2026-04-01';
-- SEARCH orders USING COVERING INDEX idx_orders_created (created>? AND created<?)
-- 84,961 rows in 33 ms
Keduanya menghasilkan baris yang sama, namun baris pertama membutuhkan waktu sekitar tiga kali lebih lama. Rencana tersebut menunjukkan alasannya: dengan fungsi pada kolom, database tidak dapat melompat ke posisi dalam indeks yang diurutkan, sehingga harus SCAN menelusuri setiap entri. Versi rentang dapat SEARCH langsung ke tempat yang tepat. Kondisi yang dapat menggunakan indeks dengan cara ini disebut sargable.
Masalah yang sama muncul dengan pola umum berikut:
| Hindari | Lebih suka |
|---|---|
DIMANA TAHUN(dibuat) = 2026 |
DIMANA dibuat >= '01-01-2026' DAN dibuat < '01-01-2027' |
DIMANA harga *2 > 100 |
DIMANA harga > 50 |
DIMANA RENDAH(email) = 'a@b.com' |
Indeks berbasis fungsi, atau susunan yang tidak peka huruf besar-kecil |
DIMANA nama SEPERTI '%99' |
Pencarian awalan, atau pencarian teks lengkap |
Kami memeriksa yang terakhir juga. Wildcard terdepan dihasilkan SCAN customers, karena indeks yang diurutkan dari huruf pertama tidak dapat membantu kecocokan di akhir.
Indeks komposit
Saat kueri memfilter pada dua kolom, indeks satu kolom hanya melakukan sebagian pekerjaan:
SELECT id FROM orders
WHERE status = 'paid'
AND created >= '2026-03-01' AND created < '2026-03-08';
-- Using only the created index: 6,198 rows in 19 ms
CREATE INDEX idx_status_created ON orders(status, created);
-- SEARCH orders USING COVERING INDEX idx_status_created
-- (status=? AND created>? AND created<?)
-- 6,198 rows in 2.2 ms
Urutan kolom sangat penting. Indeks pada (status, created) berfungsi seperti buku telepon yang diurutkan berdasarkan nama belakang dan kemudian nama depan. Anda dapat mencari nama keluarga saja, tetapi tidak hanya nama depan saja. Permintaan kami pada status saja dapat menggunakan indeks ini. Memfilter pada created saja umumnya tidak dapat menggunakannya secara efisien. Sebagai aturan praktis, letakkan kolom yang diuji dengan kesetaraan terlebih dahulu dan kolom rentang setelahnya.
Rencana tersebut juga menyatakan mencakup indeks, artinya indeks menampung semua kueri yang diperlukan, sehingga tabel itu sendiri tidak perlu dibaca. Memilih hanya kolom yang Anda perlukan membuat hal ini lebih mungkin terjadi, yang merupakan alasan lain untuk dihindari SELECT *.
Penomoran halaman lebih cepat
Menggunakan OFFSET untuk halaman dalam adalah biaya tersembunyi, karena database masih harus melewati semua baris yang dilewati:
-- Page deep into the results
SELECT id FROM orders ORDER BY id LIMIT 20 OFFSET 500000;
-- 8.1 ms
-- Keyset pagination: continue from the last id seen
SELECT id FROM orders WHERE id > 500000 ORDER BY id LIMIT 20;
-- 0.01 ms
Penomoran halaman keyset tetap cepat tidak peduli seberapa dalam Anda melakukannya. Ini juga menghindari perpindahan baris antar halaman saat data baru ditambahkan. Kerugiannya adalah pengguna tidak dapat langsung membuka halaman 5.000, yang jarang merupakan kebutuhan nyata. Pada tabel dengan baris yang lebar, atau dengan lebih banyak baris yang harus dilewati, jaraknya bisa jauh lebih besar dibandingkan dengan pengujian kami.
Kiat: Pengaturan waktu kami mengukur satu kueri pada satu waktu pada mesin yang menganggur. Di bawah beban sebenarnya, kueri yang tidak efisien menimbulkan lebih banyak kerusakan, karena kueri tersebut juga mengunci dan bersaing memperebutkan memori, disk, dan CPU dengan yang lainnya.
Tulis pertanyaan yang lebih ramping
- Pilih hanya kolom yang Anda perlukan.
SELECT *mengirimkan lebih banyak data, dan ini dapat mencegah indeks menutupi kueri. - Filter lebih awal. Gunakan
WHEREuntuk menghapus baris sebelum mengelompokkan, danHAVINGhanya untuk kondisi agregat. Lihat SQL GROUP BY dan HAVING. - Gunakan LIMIT bila Anda hanya memerlukan beberapa baris.
- Pilih UNION ALL bila Anda tidak perlu menghapus duplikat. Pengujian UNION vs UNION ALL kami menunjukkan apa yang dapat dihemat.
- Hindari DISTINCT yang tidak perlu. Seringkali menyembunyikan gabungan yang menghasilkan duplikat.
- Gunakan EXISTS untuk pemeriksaan keberadaan. Ini bisa berhenti pada kecocokan pertama, seperti yang dijelaskan dalam panduan kami untuk subkueri SQL.
- Perhatikan N+1 kueri. Satu kueri per baris dalam satu loop, biasanya disebabkan oleh kode aplikasi, sering kali merupakan masalah sebenarnya. Satu kueri gabungan atau kumpulan dapat menggantikan ratusan perjalanan bolak-balik.
Bergabung
Indeks kolom tempat Anda bergabung. Kami menjalankan laporan total pembelanjaan untuk pelanggan di satu kota, dan rencana tersebut sesuai dengan harapan Anda:
SELECT c.name, SUM(o.total)
FROM customers c
JOIN orders o ON o.customer_id = c.id
WHERE c.city = 'Goa'
GROUP BY c.id;
-- SCAN c
-- SEARCH o USING COVERING INDEX idx_cover (customer_id=?)
-- 9,900 rows in 34 ms
Ini memindai pelanggan, lalu menggunakan indeks untuk menemukan pesanan masing-masing. Tanpa indeks pada orders.customer_id, database harus melakukan lebih banyak pekerjaan untuk setiap pelanggan. Indeks pada kunci asing adalah salah satu tambahan paling umum dan berharga yang dapat Anda buat. Untuk menyegarkan kembali pemahaman Anda tentang dasar-dasarnya, lihat penjelasan gabungan SQL.
Ketika indeks merugikan Anda
Indeks tidak gratis, jadi jangan tambahkan satu indeks untuk setiap kolom:
- Penulisan lebih lambat. Setiap penyisipan, pembaruan, dan penghapusan juga harus memperbarui setiap indeks.
- Lebih banyak penyimpanan dan memori. Indeks dapat bertambah besar di tabel besar.
- Sedikit manfaat pada kolom yang tidak selektif. Indeks pada kolom benar atau salah mungkin tidak membantu jika sebagian besar baris cocok.
- Redundansi. Indeks pada
(a)sering kali tidak diperlukan jika Anda sudah memilikinya di(a, b).
Periksa statistik penggunaan secara berkala, dan hapus indeks yang tidak ada gunanya. Dan selalu perbarui statistik dengan ANALYZE atau database Anda yang setara, karena pengoptimal mengandalkan statistik tersebut untuk memilih paket yang baik. Terkadang bagian yang lambat adalah pertikaian, bukan pertanyaan. Penguncian transaksi yang berjalan lama dapat membuat kueri cepat terasa lambat.
Kesalahan umum
- Mengoptimalkan tanpa mengukur. Banyak tebakan yang meyakinkan ternyata salah.
- Menguji dengan data kecil. Rencana dan waktu berubah secara dramatis seiring bertambahnya tabel.
- Mempercayai tip untuk database lain. Saran untuk satu mesin mungkin tidak berlaku untuk mesin lainnya.
- Menambahkan indeks secara membabi buta. Masing-masing memperlambat penulisan.
- Mengabaikan efek pengoperasian pertama. Cache membuat pengoperasian kedua lebih cepat, jadi jalankan beberapa kali.
Penutup
Sebagian besar kueri lambat memiliki penyebab biasa: indeks hilang, fungsi pada kolom, atau terlalu banyak data yang diambil. Ambil kueri nyata Anda yang paling lambat minggu ini, jalankan EXPLAIN di atasnya, dan cari pemindaian penuh pada tabel besar. Perbaiki satu hal, ukur lagi, dan catat apa yang Anda ubah.
Pertanyaan yang sering diajukan
Apa itu optimasi kueri SQL?
Ini adalah proses membuat kueri menggunakan lebih sedikit waktu dan sumber daya, biasanya dengan memeriksa rencana eksekusi, menambahkan indeks yang sesuai, dan menulis ulang kueri yang tidak efisien.
Apa yang dimaksud dengan rencana eksekusi?
Ini adalah strategi yang dipilih database untuk menjalankan kueri, termasuk cara database membaca tabel, indeks apa yang digunakan, dan urutan penggabungannya.
Bagaimana cara menemukan pertanyaan yang lambat?
Aktifkan log kueri lambat database Anda atau gunakan alat seperti pg_stat_statements di PostgreSQL. Kemudian fokus pada kueri dengan total waktu tertinggi.
Apakah menambahkan indeks selalu membuat kueri lebih cepat?
Tidak. Ini membantu pembacaan selektif tetapi memperlambat penulisan dan menggunakan penyimpanan. Pengoptimal juga dapat mengabaikannya jika sebagian besar baris cocok dengan kondisi tersebut.
Apakah SELECT * buruk untuk kinerja?
Itu bisa saja. Ini mentransfer data yang tidak diperlukan dan dapat menghentikan indeks untuk mencakup kueri. Biasanya lebih baik hanya mencantumkan kolom yang Anda perlukan.
Teruslah belajar
Butuh bantuan dengan pengujian, WordPress atau SEO?
Kami membantu tim mengirimkan perangkat lunak yang lebih baik dan mengembangkan situs mereka. Beritahu kami apa yang sedang Anda kerjakan dan kami akan menyarankan langkah selanjutnya yang jelas.
Panduan lebih lanjut tentang pengujian, AI & pengembangan modern
Menikmati artikel ini? Pilih topik dan langsung masuk ke tutorial terbaru kami.
Penjelasan Halusinasi AI: Mengapa Model Bahasa Memperbaiki Masalah dan Cara Menguranginya
Halusinasi AI menjelaskan: apa itu, mengapa model bahasa memproduksinya, tipe umum, cara menguranginya dengan landasan dan petunjuk, dan pemeriksaan…
Baca artikel →DevOpsPenjelasan Variabel Lingkungan: File .env, Rahasia, dan Konfigurasi Dilakukan dengan Benar
Variabel lingkungan dijelaskan dengan contoh Python yang kami jalankan: membaca dan mengaturnya, mengapa setiap nilai berupa string, file .env, pewa…
Baca artikel →Pengembangan perangkat lunakPenjelasan Pembatasan Kecepatan API: Algoritma, Header, dan Penanganan 429 Kesalahan
Pembatasan laju API dijelaskan dengan simulasi yang kami jalankan: keranjang token, jendela tetap, jendela geser, respons 429, header batas laju, pe…
Baca artikel →Otomatisasi pengujianMengejek dengan Python: unittest.mock, patch dan Kesalahan yang Membuat Tes Berbohong
Mengejek dengan Python dengan unittest.mock, menguji: Mock dan return_value, side_effect, menambal di mana nama digunakan, spesifikasi dan autospec,…
Baca artikel →Pengujian perangkat lunakPenjelasan Cakupan Kode: Cakupan Jalur vs Cabang dan Apa Arti 100% Sebenarnya
Cakupan kode dijelaskan dengan coverage.py yang sebenarnya dijalankan: cakupan garis, cabang dan kondisi, membaca laporan, mengapa cakupan 100% masi…
Baca artikel →Basis data & SQLDELETE vs TRUNCATE vs DROP dalam SQL: Perbedaan, Rollback dan Kapan Menggunakan Masing-Masing
DELETE vs TRUNCATE vs DROP dijelaskan dengan SQL yang diuji: apa yang dihapus, rollback, pemicu, reset identitas, kecepatan, dan perbedaan PostgreSQ…
Baca artikel →Basis data & SQLPenjelasan Tampilan SQL: Membuat, Menggunakan, dan Menghindari Kesalahan, Dengan Contoh
Tampilan SQL dijelaskan dengan kueri yang kami jalankan: membuat tampilan, hasil langsung, menyembunyikan kolom, kinerja, tampilan yang dapat diperb…
Baca artikel →Pengembangan perangkat lunakAntarmuka TypeScript vs Tipe: Perbedaan Nyata, Diuji Dengan Kompiler
Antarmuka TypeScript vs tipe, diperiksa dengan kompiler sebenarnya: apa yang bisa dilakukan keduanya, apa yang hanya bisa dilakukan satu orang, peng…
Baca artikel →Pengembangan perangkat lunakPenjelasan Python *args dan **kwargs: Fungsi Fleksibel Dengan Contoh Jelas
Python *args dan **kwargs dijelaskan dengan kode yang kami jalankan: pengepakan dan pembongkaran, urutan parameter, argumen hanya kata kunci dan pos…
Baca artikel →Pengembangan perangkat lunakFungsi Python Lambda: Sintaks, Kegunaan Sebenarnya, dan Kapan Tidak Digunakan
Fungsi python lambda dijelaskan dengan kode yang kami jalankan: sintaksis, pengurutan dengan kunci, peta dan filter, penutupan, jebakan pengikatan a…
Baca artikel →Kecerdasan buatanApa Itu Agen AI? Cara Kerjanya, Dengan Agent Loop Sederhana yang Dapat Anda Jalankan
Apa itu agen AI? Panduan sederhana tentang loop agen, alat, memori, dan pagar pembatas, dengan loop Python kecil yang kami jalankan, risiko nyata da…
Baca artikel →DevOpsPemantauan vs Observabilitas: Perbedaan Nyata, Dengan Log, Metrik, dan Jejak
Penjelasan pemantauan vs observabilitas: kegagalan yang diketahui dan tidak diketahui, log, metrik dan jejak, penelusuran insiden checkout, sinyal e…
Baca artikel →DevOpsVolume Docker vs Bind Mounts: Pertahankan Data Kontainer dengan Cara yang Benar
Volume Docker vs pengikatan pengikat dijelaskan: mengapa data kontainer menghilang, volume yang diberi nama, pengikatan pengikatan, tmpfs, contoh Tu…
Baca artikel →Otomatisasi pengujianTDD vs BDD: Perbedaan Utama, Satu Fitur Dibangun dengan Dua Cara dan Kapan Menggunakan Masing-masing
TDD vs BDD dijelaskan dengan satu fitur diskon yang dibuat dengan dua cara: refactor merah-hijau dengan kode yang kami jalankan, skenario Mengingat-…
Baca artikel →Pengujian perangkat lunakUser Acceptance Testing (UAT): Proses, Checklist dan Contoh Nyata
Pengujian penerimaan pengguna menjelaskan: siapa yang menjalankannya, perbedaannya dengan QA, proses tujuh langkah, templat kasus uji UAT, daftar pe…
Baca artikel →Basis data & SQLPenjelasan Nilai NULL SQL: IS NULL, COALESCE, NULLIF dan Jebakan yang Harus Dihindari
Nilai SQL NULL dijelaskan dengan kueri yang kami jalankan: logika tiga nilai, IS NULL, COALESCE, NULLIF, cara agregat, penggabungan, dan pengurutan …
Baca artikel →Basis data & SQLPernyataan SQL CASE WHEN: Sintaks, Contoh Nyata dan Kesalahan Umum
SQL CASE KETIKA dijelaskan dengan kueri yang kami jalankan: formulir sederhana dan dicari, urutan kondisi, pivot dengan SUM, trik COUNT, pengurutan …
Baca artikel →Pengembangan perangkat lunakApa itu JWT? Token Web JSON Dijelaskan Dengan Contoh Kerja
Apa itu JWT? JSON Web Tokens menjelaskan: tiga bagian, token yang dibuat dan dirusak dalam kode yang kami jalankan, sesi JWT vs, penyimpanan, token …
Baca artikel →Pengembangan perangkat lunakPenjelasan Loop Acara JavaScript: Call Stack, Microtasks, dan Timer Dengan Contoh
Perulangan peristiwa JavaScript dijelaskan dengan kode yang kami jalankan: tumpukan panggilan, antrian tugas dan tugas mikro, mengapa setTimeout 0 t…
Baca artikel →Pengembangan perangkat lunakGenerator Python dan Penjelasan Hasil: Menghemat Memori Dengan Contoh Nyata
Generator dan hasil Python dijelaskan dengan kode yang kami jalankan: bagaimana mereka menjeda dan melanjutkan, mengukur penghematan memori, saluran…
Baca artikel →Kecerdasan buatanApa itu Embedding? Kesamaan Vektor dan Kosinus Dijelaskan Secara Sederhana
Apa itu embeddings? Panduan bahasa sederhana tentang vektor, kesamaan kosinus, dan penelusuran semantik, dengan contoh kecil yang kami jalankan, pen…
Baca artikel →DevOpsPenerapan Biru-Hijau vs Canary: Perbedaan, Kompromi, dan Cara Memilih
Penjelasan penerapan blue-green vs canary: cara kerja masing-masing, biaya, risiko dan rollback, pengelompokan pengguna stabil yang kami uji, migras…
Baca artikel →Otomatisasi pengujianTes Tidak Stabil: Apa Penyebabnya dan Cara Memperbaikinya untuk Kebaikan
Pengujian yang tidak stabil dijelaskan dengan demo yang kami jalankan: penyebab utama, cara mengonfirmasi dan mendiagnosisnya, perbaikan waktu yang …
Baca artikel →Pengujian perangkat lunakLoad Testing vs Stress Testing: Perbedaan, Metrik dan Contoh k6
Penjelasan pengujian beban vs pengujian stres: apa yang dibuktikan masing-masing, pengujian lonjakan dan rendam, metrik yang penting, mengapa rata-r…
Baca artikel →Pengujian perangkat lunakKasus Uji vs Skenario Uji: Perbedaan Utama, Contoh, dan Kapan Menggunakan Masing-masing
Penjelasan kasus uji vs skenario pengujian: definisi yang jelas, tabel berdampingan, satu fitur pengaturan ulang kata sandi yang diambil dari skenar…
Baca artikel →Basis data & SQLOptimasi Kueri SQL: Baca Rencana Eksekusi dan Perbaiki Kueri Lambat, Dengan Pengaturan Waktu
Pengoptimalan kueri SQL diuji pada sejuta baris: membaca rencana eksekusi, menambahkan indeks yang tepat, memperbaiki filter yang tidak dapat disarg…
Baca artikel →Basis data & SQLSQL UNION vs UNION ALL: Perbedaan, Contoh dan Kinerja Diuji
SQL UNION vs UNION ALL dijelaskan dengan kueri yang kami jalankan: duplikat, aturan yang diikuti keduanya, bug data nyata, kinerja terukur, INTERSEC…
Baca artikel →Pengembangan perangkat lunakTutorial API Pengambilan JavaScript: GET, POST, Penanganan Kesalahan, dan Batas Waktu
Tutorial JavaScript Fetch API diuji pada server lokal: GET dan POST, mengapa 404 tidak muncul, bantuan yang dapat digunakan kembali, string kueri, b…
Baca artikel →Pengembangan perangkat lunakPenanganan File Python: Baca, Tulis, CSV, JSON dan pathlib Dengan Contoh
Penanganan file Python dijelaskan dengan kode yang kami jalankan: mode terbuka, dengan, membaca file besar, CSV, JSON, pathlib, file biner, penulisa…
Baca artikel →Pengembangan perangkat lunakGit merge vs rebase: perbedaan, contoh, dan kapan memakai masing-masing
Git merge vs rebase dijelaskan dengan keluaran log nyata, tabel perbandingan, aturan emas rebase, dan alur kerja tim yang aman.
Baca artikel →Pengembangan perangkat lunakList Comprehension Python: Sintaks, Contoh, dan Kapan Harus Dihindari
List comprehension Python dijelaskan: sintaks, filter, if-else, perulangan bersarang, waktu yang diukur, dan kapan perulangan for biasa lebih baik.
Baca artikel →Basis data & SQLPenjelasan SQL JOIN dengan Contoh (Inner, Left, Right, Full)
Pahami SQL JOIN langkah demi langkah dengan tabel dan query contoh: INNER, LEFT, RIGHT, FULL, CROSS, dan SELF, plus kesalahan umum dan tips performa.
Baca artikel →