Zdecydowanie powinieneś poświęcić trochę czasu na czytanie na temat indeksowania, jest dużo na ten temat napisanych i ważne jest, aby zrozumieć, co się dzieje.
Mówiąc ogólnie, indeks narzuca porządek w wierszach tabeli.
Dla uproszczenia wyobraź sobie, że tabela to tylko duży plik CSV. Ilekroć wiersz jest wstawiany, jest wstawiany na końcu . Tak więc „naturalne” uporządkowanie tabeli to tylko kolejność wstawiania wierszy.
Wyobraź sobie, że masz załadowany plik CSV w bardzo podstawowej aplikacji do obsługi arkuszy kalkulacyjnych. Cały ten arkusz kalkulacyjny wyświetla dane i numeruje wiersze w kolejności sekwencyjnej.
Teraz wyobraź sobie, że musisz znaleźć wszystkie wiersze o wartości „M” w trzeciej kolumnie. Biorąc pod uwagę to, co masz dostępne, masz tylko jedną opcję. Skanujesz tabelę sprawdzając wartość trzeciej kolumny dla każdego wiersza. Jeśli masz dużo wierszy, ta metoda („skanowanie tabeli”) może zająć dużo czasu!
Teraz wyobraź sobie, że oprócz tej tabeli masz indeks. Ten konkretny indeks jest indeksem wartości w trzeciej kolumnie. Indeks zawiera wszystkie wartości z trzeciej kolumny, w pewnej znaczącej kolejności (powiedzmy alfabetycznie), a dla każdej z nich zawiera listę numerów wierszy, w których pojawia się ta wartość.
Teraz masz dobrą strategię znajdowania wszystkich wierszy, w których wartość trzeciej kolumny to „M”. Na przykład możesz przeprowadzić wyszukiwanie binarne ! Podczas gdy skanowanie tabeli wymaga spojrzenia na N wierszy (gdzie N jest liczbą wierszy), wyszukiwanie binarne wymaga jedynie spojrzenia na wpisy indeksu log-n, w najgorszym przypadku. Wow, to na pewno o wiele łatwiejsze!
Oczywiście, jeśli masz ten indeks i dodajesz wiersze do tabeli (na końcu, ponieważ tak działa nasza tabela pojęciowa), musisz aktualizować indeks za każdym razem. Robisz więc trochę więcej pracy, pisząc nowe wiersze, ale oszczędzasz mnóstwo czasu, gdy czegoś szukasz.
Ogólnie rzecz biorąc, indeksowanie tworzy kompromis między wydajnością odczytu a wydajnością zapisu. Bez indeksów wstawianie może być bardzo szybkie - silnik bazy danych po prostu dodaje wiersz do tabeli. Podczas dodawania indeksów silnik musi aktualizować każdy indeks podczas wykonywania wstawiania.
Z drugiej strony odczyty stają się znacznie szybsze.
Mam nadzieję, że obejmuje to pierwsze dwa pytania (jak odpowiedzieli inni - musisz znaleźć właściwą równowagę).
Twój trzeci scenariusz jest nieco bardziej skomplikowany. Jeśli używasz LIKE, mechanizmy indeksowania zazwyczaj pomogą zwiększyć szybkość odczytu do pierwszego „%”. Innymi słowy, jeśli wybierasz GDZIE kolumna JAK „foo% bar%”, baza danych użyje indeksu, aby znaleźć wszystkie wiersze, w których kolumna zaczyna się od „foo”, a następnie musisz przeskanować ten pośredni zestaw wierszy, aby znaleźć podzbiór który zawiera „pasek”. WYBIERZ ... GDZIE kolumna JAK „% bar%” nie może korzystać z indeksu. Mam nadzieję, że rozumiesz dlaczego.
Wreszcie, musisz zacząć myśleć o indeksach w więcej niż jednej kolumnie. Koncepcja jest taka sama i zachowuje się podobnie jak w LIKE - zasadniczo, jeśli masz indeks na (a, b, c), silnik będzie nadal korzystał z indeksu od lewej do prawej tak dobrze, jak to możliwe. Tak więc wyszukiwanie w kolumnie a może korzystać z indeksu (a, b, c), tak jak w przypadku (a, b). Jednak silnik musiałby wykonać pełny skan tabeli, jeśli szukałeś GDZIE b = 5 ORAZ c = 1)
Mam nadzieję, że pomoże to rzucić nieco światła, ale muszę powtórzyć, że najlepiej jest spędzić kilka godzin na szukaniu dobrych artykułów, które wyjaśniają te rzeczy dogłębnie. Dobrym pomysłem jest również przeczytanie dokumentacji konkretnego serwera bazy danych. Sposób, w jaki wskaźniki są implementowane i używane przez planistów zapytań, może się znacznie różnić.