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?
sumber
Untuk menjawab pertanyaan awal Anda, ya, indeks harus dirancang di sekitar kueri , bukan hanya tabel . Urutan bidang dalam indeks sangat penting. Mendesain indeks tunggal agar optimal untuk beberapa kueri lebih sulit, dan Anda harus melakukan trade-off.
Mengenai poin kedua Anda, ya, banyak indeks pada satu bidang tunggal adalah hal yang sangat umum. Saya melihatnya sepanjang waktu di lingkungan saya, dan biasanya merupakan tanda merah bagi saya bahwa tim pengembangan tidak bekerja dengan DBA untuk merancang indeks yang tepat.
Strategi saya untuk merancang indeks, adalah untuk mengindeks:
Jadi untuk contoh Anda:
Saya mungkin akan merancang indeks pada (ID Pelanggan, dateCreated) TERMASUK (id, nama). Indeks penutup ini berarti permintaan tidak perlu mengenai tabel asli, sangat meningkatkan kinerja.
Contoh ini hampir terlalu sederhana. Indeks naif pada just (CustomerID) akan melakukan hampir juga (dengan asumsi bahwa setiap pelanggan hanya memiliki satu rep, sehingga hanya pencarian bookmark tunggal ke tabel akan diperlukan). Bahkan mungkin bermanfaat untuk benar-benar melakukan pengelompokan indeks pada (ID Pelanggan, ID), tergantung pada pertanyaan apa yang dijalankan terhadap tabel.
sumber