Tanpa indeks, DB harus membaca seluruh tabel untuk menemukan baris yang memenuhi kondisi (full table scan).
Mengapa Deploy fitur baru menambahkan pencarian dengan kondisi yang tidak punya indeks → Akibatnya Jutaan baris dipindai semua, sehingga satu query butuh ratusan ms hingga beberapa detik → Di layar Loading mailbox dan riwayat trade tertunda, koneksi tertahan sehingga request lain ikut menunggu
Penanggung jawab utama Pengembangan server (Tim Pengembang Game) · Turut terlibat Infrastruktur DB (Tim Infrastruktur)
Tugas Tim Pengembang Game
Tinjau query plan setiap query baru sebelum deploy, tambahkan indeks, pastikan query yang mengubah data (UPDATE, DELETE) juga memakai indeks.
Tugas Tim Infrastruktur
Pantau slow query log, temukan query yang melakukan full table scan lalu bagikan ke Tim Pengembang Game, tambahkan indeks saat layanan berjalan dengan metode online yang lock-nya singkat.
Kisaran angka
Dengan indeks, beberapa ms. Tanpa indeks, query melambat sebanding dengan ukuran data, dan pada tabel besar bisa ratusan hingga puluhan ribu kali lebih lambat.
Di grafik
Naik seperti anak tangga · Latensi query DB, jumlah baris yang dibaca
Yang diperiksa
MySQL: periksa Rows_examined dan Rows_sent di slow query log (jika log_queries_not_using_indexes diaktifkan, query yang tidak memakai indeks juga dicatat) serta SUM_NO_INDEX_USED dan SUM_ROWS_EXAMINED di performance_schema events_statements_summary_by_digest, lalu jalankan EXPLAIN. PostgreSQL: periksa seq_scan dan seq_tup_read di pg_stat_user_tables, lalu jalankan EXPLAIN
Cocok jika
Query yang baru muncul setelah deploy membaca baris (Rows_examined) ribuan kali lebih banyak daripada baris yang dikembalikan (Rows_sent), dan EXPLAIN menunjukkan full table scan (MySQL type ALL, PostgreSQL Seq Scan). seq_tup_read pada tabel besar naik tajam sejak waktu deploy
Tidak cocok jika
Sudah memakai indeks tetapi tetap lambat: lebih mungkin menunggu lock (db-hot-row, db-ddl-lock) atau query plan berubah (db-plan-flip). Full table scan pada tabel kecil bisa saja normal
Sarana pemeriksaan
Tools infrastruktur (tanpa perlu kode game)
Pelajari lebih lanjut
Dampaknya tidak terbatas pada pembacaan. Tergantung DB-nya, query pengubah data (UPDATE, DELETE) tanpa indeks ikut mengunci baris yang dipindai, sehingga penyimpanan pemain yang tidak terkait pun bisa terhalang.
Sumber
How MySQL Uses IndexesMySQL Tanpa indeks, DB membaca seluruh tabel mulai dari baris pertama, dan makin besar tabel, makin besar biayanya
Locks Set by Different SQL Statements in InnoDBMySQL Jika tidak ada indeks yang cocok dan seluruh tabel dipindai, semua baris terkunci sehingga pengguna lain bahkan tidak bisa menambah baris
The Slow Query LogMySQL Mencatat query yang melebihi long_query_time (default 10 detik); query yang tidak memakai indeks juga bisa dicatat terpisah
CREATE INDEX (PostgreSQL Documentation)PostgreSQL Dengan CONCURRENTLY, indeks dibuat tanpa memblokir penulisan; pembuatan biasa memblokir penulisan sampai selesai
Statement Summary TablesMySQL events_statements_summary_by_digest: SUM_NO_INDEX_USED (jumlah eksekusi tanpa indeks) dan SUM_ROWS_EXAMINED per pola query yang sama
EXPLAIN Output FormatMySQL type ALL berarti full table scan; biasanya dihindari dengan menambahkan indeks