2010-04-26 15 views
7

Przeczytałem na MySQL Performance Blog, że gdy tabele są duże, lepiej jest skanować pełne tabele, zamiast korzystać z indeksów.Czy indeksy są dobre czy złe dla dużej bazy danych?

Mam stół z dziesiątkami milionów wierszy. Podczas wykonywania zapytań, jeśli nie używam indeksów, zapytania są 24 razy wolniejsze niż w przypadku indeksów. Wiem, że wiele rzeczy może to powodować (np. Czy wiersze są przechowywane sekwencyjnie), ale czy możesz podać mi kilka wskazówek, co może się wydarzyć? Albo jak powinienem rozpocząć badanie tego problemu? Chcę zrozumieć, kiedy jest korzystne stosowanie indeksów, a gdy to nie

Dzięki

+1

Nie można nawet oddychać bez indeksów! –

+0

Dobre testy porównawcze dotyczące wykonywania pracy we własnej bazie danych. Jeśli chodzi o wydajność, testowanie zawsze mówi, która droga jest szybsza. – phkahler

Odpowiedz

8

Artykuł mówi, że podczas pracy z bardzo dużymi zestawami danych, w których liczba wierszy, z którymi musisz pracować, zbliża się do liczby wierszy znajdujących się w tabeli, użycie indeksu może zaszkodzić wydajności.

W takim przypadku przeglądanie indeksu będzie miało negatywny wpływ na wydajność, o ile potrzebujesz więcej danych niż jest w indeksie.

Aby przejść przez indeks, silnik bazy danych musi najpierw odczytać duże części tabeli indeksu (jest to typ tabeli), a następnie dla każdego wiersza (lub zestawu wierszy) od tego wyniku przejść do rzeczywistego table i zacznij przeglądać strony do przeczytania.

Jeśli, z drugiej strony, wystarczy pobrać kolumny, które już stanowią część tabeli indeksów, a następnie silnik bazy danych musi tylko odczytywać dane i nie przechodzić do pełnej tabeli, aby uzyskać więcej danych.

Jeśli skończysz czytać większość lub prawie całą rzeczywistą tabelę, wszystkie prace, które należy wykonać, aby zająć się indeksem, mogą być bardziej skomplikowane niż zwykłe pełne skanowanie tabeli.

Teraz jest to wszystkie artykuł mówi. W przypadku większości prac związanych z bazą danych dokładniejsze jest używanie indeksów.

Na przykład, jeśli chcesz wyodrębnić mały zestaw wierszy, przeglądanie indeksu zamiast pełnego skanowania tabeli będzie szybsze o wiele rzędów wielkości.

W każdym razie, jeśli masz wątpliwości, powinieneś wykonać profilowanie wydajności, aby dowiedzieć się, jak twoja aplikacja zachowuje się przy różnych rodzajach obciążeń, a następnie zacząć ulepszać, nie traktuj jednego artykułu jako srebrnej kuli za nic.

Na przykład, jednym ze sposobów, aby przyspieszyć przykładowe pytania, które robi liczyć na kolumnie w artykule pad, byłoby utworzyć jeden indeks, który obejmował zarówno val i pad, w ten sposób liczba byłoby po prostu skanowanie indeksu, a nie skanowanie indeksu + wyszukiwanie tabeli i przebiegałby szybciej niż pełne skanowanie tabeli.

Najlepszą opcją jest poznanie swoich danych, eksperymentowanie i wiedza o tym, jak działają używane narzędzia. Dowiedz się więcej o indeksach, ale ostatecznie to jesteś, który decyduje, co jest najlepsze dla twojego programu.

+1

Jak mówi artykuł: "Nawet jeśli spojrzysz na 1% lub wiersze lub mniej pełne skanowanie tabeli może być szybsze." Więc nie być kulawy, ale odpowiedź wydaje się być "to zależy od konkretnej sytuacji." –

+0

Tak, rzeczywiście tak. –

1

Jest to dobra praktyka, aby umieścić wskaźnik na każdej kolumny, które zostało użyte w GDZIE klauzuli.

2

Jak zwykle to zależy. Do tej pory nigdy nie wpadłem na scenariusz opisany w tych wpisach na blogu. Używanie indeksów w moich zapytaniach dla dużych (ponad 50 milionów wierszy) było od 100 do 10000 razy szybsze niż wykonywanie pełnego skanowania tabeli na tych dużych tabelach.

Prawdopodobnie nie ma tu srebrnej kuli, musisz przetestować swoje dane i konkretne zapytania.

Powiązane problemy