한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

Buku Putih Lag Game › L12 Database

Query tanpa indeks Missing index / full table scan

ID penyebab db-no-index · Penanggung jawab utama Pengembangan server (Tim Pengembang Game) · Turut terlibat Infrastruktur DB (Tim Infrastruktur)

Buka kartu interaktif dengan gambar dan simulasi →

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

Gejala
Input lag, Tidak bisa masuk / loading tanpa henti
Faktor
Latensi, Stall
Siapa yang mengalami
Fitur tertentu saja, Seluruh server
Kapan
Saat melakukan aksi tertentu
Penanggung jawab
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

  1. How MySQL Uses Indexes MySQL
    Tanpa indeks, DB membaca seluruh tabel mulai dari baris pertama, dan makin besar tabel, makin besar biayanya
  2. Locks Set by Different SQL Statements in InnoDB MySQL
    Jika tidak ada indeks yang cocok dan seluruh tabel dipindai, semua baris terkunci sehingga pengguna lain bahkan tidak bisa menambah baris
  3. The Slow Query Log MySQL
    Mencatat query yang melebihi long_query_time (default 10 detik); query yang tidak memakai indeks juga bisa dicatat terpisah
  4. CREATE INDEX (PostgreSQL Documentation) PostgreSQL
    Dengan CONCURRENTLY, indeks dibuat tanpa memblokir penulisan; pembuatan biasa memblokir penulisan sampai selesai
  5. Statement Summary Tables MySQL
    events_statements_summary_by_digest: SUM_NO_INDEX_USED (jumlah eksekusi tanpa indeks) dan SUM_ROWS_EXAMINED per pola query yang sama
  6. EXPLAIN Output Format MySQL
    type ALL berarti full table scan; biasanya dihindari dengan menambahkan indeks
  7. The Cumulative Statistics System (PostgreSQL Documentation) PostgreSQL
    seq_scan (jumlah sequential scan) dan seq_tup_read (jumlah baris yang dibaca lewat sequential scan) di pg_stat_user_tables
  8. Using EXPLAIN (PostgreSQL Documentation) PostgreSQL
    Seq Scan: query plan yang membaca semua baris tabel secara berurutan

Lihat juga

Lapisan yang sama: L12 Database

Penyebab di lapisan lain dengan gejala yang sama (Input lag)

Lihat kartu interaktif dengan gambar dan simulasi