Lompati ke konten utama
Modul 10 · Pelajaran 3 dari 439/57 dalam kursus~12 min
Pelajaran modul (3/4)

Indeks komposit dan parsial

Dalam pelajaran sebelumnya kita telah membahas penggunaan indeks untuk kueri DBMS linier (WHERE country = 'Italy'). Bagaimana jika kita melakukan penelusuran pada dua bidang yang digabungkan?

Misalnya, dalam e-niaga nyata, kami mungkin ingin menemukan pesanan milik ID pelanggan tertentu DAN berada dalam rentang waktu tertentu: WHERE customer_id = 90 AND placed_at >= '2025-01-01'.

Jika Anda hanya memiliki indeks dasar pada customer_id, Postgres akan menemukan 50 pesanan pelanggan dalam waktu singkat menggunakan pohon biner, tetapi kemudian harus mengulangi 50 pesanan tersebut secara manual dan berurutan, dengan malas memfilter tanggal berdasarkan mata.

Indeks Komposit

Kita dapat memberitahu DBMS untuk mengurutkan file "kamus analitis" tidak berdasarkan satu dimensi kunci, namun menurut beberapa dimensi kunci.

SQL
CREATE INDEX idx_orders_customer_date ON orders(customer_id, placed_at);

Indeks "komposit" memperlakukan urutan parameternya sebagai hal yang sangat penting: di sini node B-Tree mengelompokkan dan mengkategorikan secara kaku customer_id dalam sebuah blok (yang paling diskriminatif untuk pemisahan); di dalamnya terdapat sub-pohon yang bercabang dengan berbagai nilai waktu placed_at dalam urutan yang terurut sempurna.

Struktur ini secara brutal memusnahkan klausa WHERE dengan banyak predikat bertingkat.

Indeks Parsial (Indeks yang Difilter)

Setiap indeks memerlukan ruang disk dan CPU pada aliran input pengguna. Bagaimana jika e-niaga memerlukan penyortiran dan pengambilan filter secara terus-menerus, namun hanya untuk sebagian kecil catatan? (Misalnya: melakukan polling cepat pada pemeriksaan notifikasi yang belum dibaca.) Membuat indeks "is_read" pada 10.000.000 notifikasi akan sangat membosankan jika "Belum Dibaca" hanya mewakili 5 notifikasi.

SQL
CREATE INDEX idx_unread_notifs ON notifications(user_id)
  WHERE is_read = false; -- Questa aggiuntiva è l'"Indice Parziale"

Basis data akan membangun B-Tree secepat kilat yang menyimpan kunci akses cepat ke DB HANYA jika catatannya Belum Dibaca! Disk akan jatuh cinta dengan indeks 5 baris (3 byte) bukannya satu dengan 10 juta. Fast SELECT mendapatkan keuntungan penuh:

SELECT * FROM notifications WHERE user_id = 2 AND is_read = false;

Giliranmu

Latihan#sql.m10.l3.e1
Upaya: 0Memuat…

Kami ingin mengoptimalkan pencarian kata sandi sementara/token reset. Kami sangat sering melakukan panggilan SELECT untuk mencari semua pelanggan yang mendaftar dari negara tertentu yang dikombinasikan dengan kota yang dikenal.\nBuat indeks gabungan bernama 'idx_cust_loc' pada 'pelanggan'. Lewati kolom 'negara' terlebih dahulu (yang lebih eksklusif) dan kemudian kolom 'kota'.

Memuat editor…
Tunjukkan petunjuk

Sintaks: BUAT nama INDEKS PADA tabel(col1, col2);

Solusi tersedia setelah 3 upaya

Menjelajahi indeks bersyarat (Parsial).

Latihan#sql.m10.l3.e2
Upaya: 0Memuat…

Optimalkan pencarian pengguna belanja: pengguna melakukan prapendaftaran tetapi kami hanya perlu mencantumkannya dalam urutan pendaftaran kronologis (buat indeks pada 'signed_up_on' di 'pelanggan') namun TERBATAS HANYA untuk pelanggan dari string lengkap 'kota': 'Milano'.

Memuat editor…
Tunjukkan petunjuk

Hal ini dinyatakan secara normal pada properti target; pada akhirnya Anda menambahkan kata kunci ajaib WHERE city = 'Milano'.

Solusi tersedia setelah 3 upaya