2010-11-04 13 views
19

W dokumentach dla różnych ORM zawsze udostępniają sposób tworzenia indeksów itp. Zawsze wspominają o tym, aby utworzyć odpowiednie indeksy dla wydajności, jak gdyby była to nieodłączna wiedza dla nierejestrowanego SQLera, który potrzebuje użyj ORM. Moje rozumienie indeksów (poza PK) jest w zasadzie następujące: Jeśli planujesz wykonać kwerendy (tj. Wyszukiwanie) na podstawie zawartości kolumny, powinieneś użyć pełnotekstowego indeksu dla tej kolumny. Co jeszcze powinienem wiedzieć o indeksach (głównie dotyczących wydajności)? Czuję, że na moim progu jest świat wiedzy, ale pod nim jest zablokowana wielka zagięta podkładka pod mysz, więc nie mogę się przedostać (nie wiem, dlaczego czułem, że muszę to powiedzieć, ale dzięki za zapewnienie kanapy).Skąd mam wiedzieć, kiedy indeksować kolumnę i z czego?

Odpowiedz

21

myśleć o indeksie grubsza podobnego indeksu z tyłu książki. Jest to całkowicie oddzielny obszar od treści książki, gdzie jeśli szukasz konkretnej wartości, możesz przejść do indeksu i sprawdzić go (indeksy są uporządkowane, więc znalezienie rzeczy jest o wiele szybsze niż skanowanie każdej strony książki).

Wpis indeksu ma numer strony, dzięki czemu można szybko przejść do strony w poszukiwaniu tematu. Indeks bazy danych jest bardzo podobny; jest uporządkowaną listą odpowiednich informacji w bazie danych (pola (pola) uwzględnione w indeksie), z informacjami dla bazy danych, aby znaleźć rekordy, które pasują.

Więc ... utworzyć indeks, jeśli masz informacje, które trzeba często wyszukiwać. Normalne indeksy nie pomagają ci w "częściowym" wyszukiwaniu zapytań typu LIKE, ale w każdym przypadku, gdy potrzebujesz zestawu wyników, w którym pole X ma określone wartości, uniemożliwiają one systemowi DBMS "skanowanie" całej tabeli , szuka pasujących wartości.

Pomagają również w przypadku sortowania na kolumnie.

Kolejna rzecz, o której należy pamiętać; Jeśli DBMS pozwala na tworzenie pojedynczych indeksów, które mają wiele pól, należy sprawdzić wpływ tego, specyficzny dla Twojego DBMS. Indeks zawierający wiele pól prawdopodobnie będzie w pełni (lub w ogóle) przydatny, jeśli wszystkie te pola są używane w zapytaniu. I odwrotnie, posiadanie wielu indeksów dla pojedynczej tabeli, z jednym polem na indeks, może nie być znaczną (lub żadną) pomocą dla zapytań, które są filtrowane/sortowane według wielu pól.


Wspomniał Pan o indeksach pełnotekstowych i PK (klucze podstawowe). Różnią się one od zwykłych indeksów, choć często służą podobnym celom.

Po pierwsze, należy zwrócić uwagę, że klucz podstawowy jest zazwyczaj indeksem (w MSSQL, "indeks klastrowany", w rzeczywistości), ale nie musi tak być w szczególności. Jako przykład, MSSQL PK jest domyślnie Clustered Index; Indeksy klastrowe są wyjątkowe pod tym względem, że nie są oddzielnym bitem danych przechowywanych w innym miejscu, ale same dane są ułożone w tabeli w kolejności według indeksu klastrowanego. Dlatego popularna PK jest wartością int, która jest automatycznie generowana z sekwencyjnymi, rosnącymi wartościami. Tak więc Indeks klastrowany sortuje dane w tabeli według wartości pola. Porównaj to z tradycyjnym słownikiem; same wpisy są uporządkowane według "klucza", który jest zdefiniowanym słowem.

Ale w MSSQL (sprawdź dokumentację DBMS pod kątem twoich informacji), możesz zmienić indeks klastrowany na inne pole, jeśli chcesz. Czasem odbywa się to na polach opartych na datetime.


Indeksy pełnego tekstu to różne rodzaje zwierząt w całości. Korzystają z tych samych zasad, ale to, co robią, nie jest dokładnie takie samo jak normalne indeksy, które opisuję. Ponadto: w niektórych zapytaniach DBMS, LIKE do nie należy używać indeksu pełnotekstowego; wymagane są specjalne operatory zapytań.

Indeksy te są różne, ponieważ ich celem nie jest znalezienie/posortowanie całej wartości kolumny (liczby, daty, krótkich bitów danych), ale znalezienie pojedynczych słów/wyrażeń w tekście pole (pola) indeksowane.

Mogą one również często umożliwiać wyszukiwanie podobnych słów, różnych czasów, typowych błędów ortograficznych i tym podobnych oraz zazwyczaj ignorować słowa szumu. Różny sposób ich działania polega na tym, że mogą potrzebować różnych operatorów, aby z nich korzystać. (ponownie sprawdź lokalną dokumentację swojego DBMS!)

+3

Doskonale, dzięki. Więc, w zasadzie indeks jest po prostu listą wartości kolumny, każda z linkiem do właściwego wiersza (zakładam, że to byłby PK). W przeciwnym razie DBMS musiałoby powtarzać wiersze tabeli, szukając tylko odpowiedniej kolumny podczas wyszukiwania wyniku. Jeśli jest to (w przybliżeniu) poprawne, twoja odpowiedź bardzo mi pomogła. – orokusaki

+0

@orokusaki Edytowałem twój komentarz, jak zauważyłeś. (Mody można edytować bez ograniczeń czasowych). Dobre wyjaśnienie! –

Powiązane problemy