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?
źródło
Aby odpowiedzieć na twoje pierwotne pytanie, tak, indeksy muszą być zaprojektowane wokół zapytań , a nie tylko tabeli . Kolejność pól w indeksie jest niezwykle ważna. Zaprojektowanie jednego indeksu jako optymalnego dla wielu zapytań jest trudniejsze i będziesz musiał dokonać kompromisów.
Jeśli chodzi o twój drugi punkt, tak, kilka indeksów na pojedynczych polach jest denerwująco powszechne. Cały czas widzę to w moim środowisku i zwykle jest to dla mnie czerwona flaga, że zespół programistów nie współpracował z DBA przy projektowaniu odpowiednich indeksów.
Moja strategia projektowania indeksów polega na indeksowaniu:
Na przykład:
Prawdopodobnie zaprojektowałbym indeks na (CustomerID, dateCreated) INCLUDE (identyfikator, nazwa). Ten indeks obejmuje, że zapytanie nigdy nie musi trafić do oryginalnej tabeli, co znacznie poprawia wydajność.
Ten przykład jest jednak prawie zbyt prosty. Naiwny indeks just (CustomerID) działałby prawie równie dobrze (zakładając, że każdy klient ma tylko jedno powtórzenie, więc wymagane będzie tylko jedno wyszukiwanie zakładek do tabeli). Korzystne może być nawet wykonanie indeksu klastrowego (CustomerID, ID), w zależności od tego, jakie inne zapytania działają na tabeli.
źródło