Wiem już nieco odpowiedź na to pytanie, ale zawsze mam wrażenie, że muszę jeszcze coś więcej na ten temat.
Zasadniczo rozumiem, że ogólnie rzecz biorąc, pojedynczy indeks, który zawiera wszystkie pola, o które możesz pytać / sortować w danym momencie, raczej nie będzie użyteczny, ale widziałem tego typu rzeczy. Na przykład ktoś pomyślał: „Cóż, jeśli po prostu umieścimy wszystkie te rzeczy w indeksie, baza danych może go użyć, aby znaleźć to, czego potrzebuje”, nie widząc nigdy planu wykonania niektórych z uruchomionych zapytań.
Wyobraź sobie taki stół:
id int pk/uid
name varchar(50)
customerId int (foreign key)
dateCreated datetime
Mogę zobaczyć jeden indeks na tym name
, customerId
i dateCreated
polami.
Ale rozumiem, że taki indeks nie byłby używany w zapytaniu, takim jak na przykład:
SELECT [id], [name], [customerId], [dateCreated]
FROM Representatives WHERE customerId=1
ORDER BY dateCreated
W przypadku takiego zapytania wydaje mi się, że lepszym pomysłem byłby indeks zawierający pola customerId
i dateCreated
, przy czym customerId
pole byłoby „pierwsze”. Spowodowałoby to utworzenie indeksu, w którym dane byłyby zorganizowane w taki sposób, że zapytanie to mogłoby szybko znaleźć to, czego potrzebuje - w kolejności, w jakiej potrzebuje.
Inną rzeczą, którą widzę, być może tak często jak pierwszą, są indywidualne indeksy na każdym polu; tak, po jednym na name
, customerId
i dateCreated
pola.
W przeciwieństwie do pierwszego przykładu, tego rodzaju układ wydaje mi się czasem przynajmniej częściowo przydatny; plan wykonania zapytania może pokazywać, że przynajmniej używa indeksu customerId
do wyboru rekordów, ale nie używa indeksu z dateCreated
polem do ich sortowania.
Wiem, że jest to szerokie pytanie, ponieważ konkretną odpowiedzią na każde zapytanie w dowolnym zestawie tabel jest zazwyczaj sprawdzenie, co plan wykonania powie, że zrobi, a w przeciwnym razie uwzględnienie specyfiki tabel i zapytań w konto. Wiem także, że zależy to od częstotliwości uruchamiania zapytania, a nie narzutu związanego z utrzymywaniem dla niego określonego indeksu.
Ale przypuszczam, że to, o co pytam, jest ogólnym „punktem wyjścia” dla indeksów, czy pomysł posiadania określonych indeksów dla określonych, często pobieranych zapytań i pól w klauzulach WHERE lub ORDER BY ma sens?