Skip to content

Indeks SQL diterangkan

Cheatsheet tentang jenis indeks SQL, corak reka bentuk, dan penyelenggaraan.

Indeks menukar storan dan kelajuan tulis dengan kelajuan baca. Pilih strukturnya, hadkan barisnya, dan uruskan bloatnya.

Jadual rujukan · 31 entri
31 of 31 rows
Jenis indeks
Pokok seimbang untuk imbasan kesamaan, julat, dan tersusun. Lalai untuk kebanyakan pangkalan data.Guna untuk =, <, >, BETWEEN, ORDER BY. Langkau untuk carian teks penuh.
Indeks yang aras daunnya ialah jadual itu sendiri. Baris disimpan mengikut tertib kunci. Satu per jadual.InnoDB mengelompokkan pada kunci utama. Jadual SQL Server tanpanya ialah heap.
Struktur berasingan yang menyimpan kunci serta penuding kembali ke jadual asas. Banyak per jadual.Pada heap ia menyimpan row ID. Pada jadual berkelompok ia menyimpan kunci pengelompokan.
Jadual hash hanya untuk carian kesamaan. Padanan tepat masa malar.Guna hanya untuk operasi =; julat dan penyusunan perlukan B-tree. Hash teroptimum memori SQL Server perlukan kiraan bucket hampir dengan kiraan baris.
Generalized Inverted Index. Memetakan nilai ke baris. Dibina untuk tatasusunan dan teks penuh.Guna untuk jsonb, tatasusunan, tsvector, carian trigram. Lebih lambat dibina berbanding B-tree.
Generalized Search Tree. Boleh diperluas untuk jenis bukan skalar dan pertanyaan bertindih.Guna untuk julat geometri, kNN, kekangan pengecualian. pg_trgm mempercepatkan LIKE.
GiST berpartisi ruang. Mengpecahkan data kepada wilayah tidak bertindih melalui pokok radix atau quad.Guna untuk titik, prefiks IP, dan padanan prefiks. Bukan untuk pertanyaan bertindih; guna GiST.
Block Range Index. Menyimpan min/maks setiap julat blok. Jejak kecil.Guna pada jadual besar yang tersusun secara fizikal. Murah dibina, selektiviti lemah.
Indeks disimpan sebagai segmen lajur dan bukannya baris. Mampatan tinggi, pelaksanaan kelompok.Guna untuk imbasan analitik ke atas banyak baris dan sedikit lajur. Carian satu baris lambat.
Indeks kata songsang khusus dalam MySQL dan SQL Server. Dibina setiap lajur teks.Guna MATCH AGAINST atau CONTAINS. Teks penuh Postgres menggunakan GIN pada tsvector sebagai gantinya.
Indeks Oracle yang menyimpan satu bitmap setiap nilai berbeza. Setiap bit menandakan satu baris.Guna pada lajur kardinaliti rendah dalam gudang data padat baca. Tulis serentak bersiri setiap bitmap.
Lajur indeks diisytiharkan DESC. Kunci bagi lajur itu disimpan dalam tertib songsang.Diperlukan untuk susunan bercampur seperti (a ASC, b DESC). Susunan DESC biasa juga boleh membaca indeks biasa secara songsang.
Indeks MySQL 8 yang diabaikan oleh pengoptimum. Tetap diselenggara pada setiap tulis.Sembunyikan indeks sebelum digugurkan untuk menguji kesannya. Jadikannya kelihatan semula tanpa bina semula.
Reka bentuk
Indeks pelbagai lajur. Lajur pendahulu mesti sepadan dengan tertib penapis pertanyaan.Susun kesamaan dahulu, kemudian julat. Dua indeks tunggal tidak boleh menggantikan satu indeks komposit.
Indeks atas predikat WHERE. SQL Server memanggilnya indeks ditapis. Meliputi baris sepadan sahaja.Indeks baris active='t' sahaja. Meringkaskan saiz dan kos tulis kepada separuh.
B-tree dengan lajur bukan kunci tambahan dilampirkan. Imbasan indeks sahaja mengelak carian heap.Tambah lajur yang kerap diambil melalui INCLUDE. Mengekalkan indeks boleh disusun.
Indeks yang menguatkuasakan tiada nilai pendua. Menolak sisipan yang berlanggar.Guna untuk kunci semula jadi dan kekangan satu-ke-satu. UNIQUE NULL membenarkan banyak NULL.
Indeks dibina atas fungsi lajur dan bukannya lajur itu sendiri.Indeks lower(email) atau date_trunc('day', created_at). Pertanyaan mesti mengulang ungkapan yang tepat.
Kelas operator. Mentakrifkan bagaimana indeks membandingkan dan menyimpan jenis satu lajur.Tetapkan varchar_pattern_ops untuk LIKE 'abc%' tanpa pelipatan huruf besar. Lalai sesuai untuk kesamaan dan julat.
Pelan yang menjawab pertanyaan daripada halaman indeks sahaja. Heap tidak pernah dibaca.Perlukan setiap lajur yang diambil berada dalam indeks atau senarai INCLUDE. Vacuum mengekalkan peta kebolehlihatan terkini.
Lajur kunci asing tidak mendapat indeks automatik pada jadual yang merujuk.Indeks setiap lajur FK yang anda sambung atau padam melaluinya. Padaman berjujung mengimbas jadual anak tanpanya.
Penyelenggaraan
Pemeriksa pelan. Menunjukkan imbasan berjujung, pilihan indeks, anggaran kos.Guna EXPLAIN (ANALYZE, BUFFERS). Seq Scan pada jadual 10M baris bermaksud indeks hilang.
Mensampel lajur jadual untuk membina statistik perancang. Histogram memandu pilihan indeks.Jalankan selepas muatan pukal. Statistik basi menyebabkan seq scan pada lajur berindeks.
Setiap indeks menambah atas beban tulis. Sisipan, kemas kini, padaman membayar setiap indeks.Gugurkan indeks tidak digunakan. Jejak penggunaan dalam pg_stat_user_indexes.
Paparan Postgres bagi penggunaan setiap indeks. Mengira imbasan dan tuple dibaca sejak penetapan semula statistik.Tapis idx_scan = 0 untuk mencari indeks tidak digunakan. Set semula pengira dengan pg_stat_reset().
Membina indeks tanpa menyekat baca atau tulis. Perlukan dua imbasan jadual.Tidak boleh berjalan dalam transaksi. Binaan gagal meninggalkan indeks INVALID untuk digugurkan.
Membuang indeks dan membebaskan storannya. Mengambil kunci eksklusif secara lalai.Guna DROP INDEX CONCURRENTLY pada jadual sibuk. Semak statistik penggunaan sebelum membuang.
Membina semula indeks bloat. Mendapatkan semula ruang daripada tuple mati.Guna REINDEX CONCURRENTLY dalam produksi. Tanpanya kunci menyekat tulis.
Tuple mati dan jurang halaman yang terkumpul dalam jadual MVCC dan indeksnya.Ukur dengan pgstattuple. Vacuum kerap; REINDEX apabila ruang mati mendominasi.
Peratusan halaman dipadatkan semasa tulis. Ruang bebas menyerap kemas kini akan datang.Turunkan kepada 70-90 pada jadual kemas kini panas. Halaman penuh memaksa pemecahan halaman.
Menulis semula jadual tersusun secara fizikal mengikut indeks. Operasi sekali sahaja.Berpasangan dengan BRIN untuk blok tersusun. Tertib tidak dikekalkan pada tulisan akan datang.