| 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. |