Saya agak tahu jawaban atas pertanyaan ini, tetapi saya selalu merasa seolah-olah ada lebih banyak yang perlu saya bahas pada topik ini.
Pemahaman dasar saya adalah bahwa secara umum, indeks tunggal yang hanya mencakup semua bidang yang Anda tanyakan / sortir pada waktu tertentu sepertinya tidak akan berguna, namun saya telah melihat hal semacam ini. Seperti dalam, seseorang berpikir, "Yah, jika kita hanya meletakkan semua hal ini dalam indeks, database dapat menggunakannya untuk menemukan apa yang dibutuhkan", tanpa pernah melihat rencana eksekusi untuk beberapa pertanyaan aktual yang sedang dijalankan.
Bayangkan sebuah tabel seperti ini:
id int pk/uid
name varchar(50)
customerId int (foreign key)
dateCreated datetime
Saya mungkin melihat indeks tunggal termasuk name
, customerId
dan dateCreated
bidang.
Tetapi pemahaman saya adalah bahwa indeks seperti itu tidak akan digunakan dalam permintaan seperti, misalnya:
SELECT [id], [name], [customerId], [dateCreated]
FROM Representatives WHERE customerId=1
ORDER BY dateCreated
Untuk permintaan seperti itu, menurut saya ide yang lebih baik adalah indeks termasuk bidang customerId
dan dateCreated
, dengan customerId
bidang yang 'pertama'. Ini akan membuat indeks yang akan mengatur data sedemikian rupa sehingga permintaan ini dapat dengan cepat menemukan apa yang dibutuhkan - dalam urutan yang dibutuhkan.
Hal lain yang saya lihat, mungkin sesering yang pertama, adalah indeks individu pada setiap bidang; jadi, masing-masing aktif name
, customerId
dan dateCreated
bidang.
Berbeda dengan contoh pertama, jenis pengaturan ini bagi saya kadang-kadang setidaknya sebagian bermanfaat; rencana eksekusi kueri dapat menunjukkan bahwa setidaknya menggunakan indeks pada customerId
untuk memilih catatan, tapi itu tidak menggunakan indeks dengan dateCreated
bidang untuk mengurutkannya.
Saya tahu ini adalah pertanyaan luas, karena jawaban spesifik untuk setiap kueri tertentu pada set tabel tertentu biasanya untuk melihat apa yang dikatakan rencana eksekusi akan dilakukan, dan jika tidak mengambil spesifik tabel (s) dan pertanyaan ke rekening. Juga, saya tahu bahwa itu tergantung pada seberapa sering kueri dapat dijalankan sebagai lawan dari overhead mempertahankan indeks tertentu untuk itu.
Tetapi saya kira apa yang saya tanyakan adalah sebagai 'titik awal' umum untuk indeks, apakah gagasan memiliki indeks spesifik untuk kueri khusus yang sering ditarik dan bidang dalam klausa WHERE or ORDER BY masuk akal?