mysql za dużo indeksów?

83

Poświęcam trochę czasu na optymalizację naszej obecnej bazy danych.

W szczególności patrzę na indeksy.

Jest kilka pytań:

  • Czy istnieje coś takiego, jak zbyt wiele indeksów?
  • Co przyspieszą indeksy?
  • Co spowolnią indeksy?
  • Kiedy warto dodać indeks?
  • Kiedy dodanie indeksu jest złym pomysłem?
  • Zalety i Wady wielu indeksów a indeksy wielokolumnowe?
Hailwood
źródło

Odpowiedzi:

150

Co przyspieszą indeksy?

Pobieranie danych - instrukcje SELECT.

Co spowolnią indeksy?

Manipulacja danymi - instrukcje INSERT, UPDATE, DELETE.

Kiedy warto dodać indeks?

Jeśli uważasz, że chcesz uzyskać lepszą wydajność pobierania danych.

Kiedy dodanie indeksu jest złym pomysłem?

W tabelach, które będą wymagały dużej manipulacji danymi - wstawianie, aktualizowanie ...

Zalety i Wady wielu indeksów a indeksy wielokolumnowe?

Zapytania muszą odnosić się do kolejności kolumn w przypadku indeksu pokrywającego (indeksu obejmującego więcej niż jedną kolumnę), od lewej do prawej w definicji kolumny indeksu. Kolejność kolumn w wyciągu nie ma znaczenia, tylko kolejność kolumn 1, 2 i 3 - instrukcja wymaga odniesienia do kolumny 1, zanim będzie można użyć indeksu. Jeśli istnieje tylko odniesienie do kolumny 2 lub 3, nie można użyć indeksu pokrycia dla 1/2/3.

W MySQL można użyć tylko jednego indeksu na instrukcję SELECT / w zapytaniu (podzapytania / itp. Są postrzegane jako oddzielna instrukcja). Istnieje ograniczenie ilości miejsca na tabelę, na które pozwala MySQL. Dodatkowo uruchomienie funkcji na kolumnie indeksowanej powoduje, że indeks jest bezużyteczny - IE:

WHERE DATE(datetime_column) = ...
Kucyki OMG
źródło
11
wow, ta informacja jest naprawdę niesamowicie dobrze skonstruowana i bardzo pomocna! A dla mnie najbardziej pomocne było to, że indeks, na którym zastosowano funkcję, jest bezużyteczny ... dziękuję za tę odpowiedź!
Chris
2
@OMG, Odnośnie ostatniego akapitu, można użyć więcej niż jednego indeksu w przypadku selectscalania indeksów. percona.com/blog/2012/12/14/…
Pacerier
1
-1 do powiedzenia (1) przyspiesza tylko "SELECT", przyspieszy zapytania SELECT, UPDATE i DELETE, pod warunkiem, że indeksy są poprawnie utworzone zgodnie z warunkami "WHERE", ale wymaga aktualizacji indeksów przy manipulowaniu danymi, co oznacza że tylko zapytania INSERT będą wolniejsze (we wszystkich przypadkach) niż bez indeksów oraz (2) za stwierdzenie, że MySQL może używać tylko jednego indeksu na raz.
Patrick Allaert,
To samo co @PatrickAllaert -1 dla wprowadzających w błąd informacji o aktualizacji, usuń
Eimsas
64

Nie zgadzam się z niektórymi odpowiedziami na to pytanie.

Czy istnieje coś takiego, jak zbyt wiele indeksów?

Oczywiście. Nie twórz indeksów, które nie są używane przez żadne z Twoich zapytań. Nie twórz nadmiarowych indeksów. Użyj narzędzi, takich jak pt-duplicate-key-checker i pt-index-usage, aby pomóc Ci odkryć indeksy, których nie potrzebujesz.

Co przyspieszą indeksy?

  • Warunki wyszukiwania w klauzuli WHERE.
  • Warunki dołączenia.
  • Niektóre przypadki ORDER BY.
  • Niektóre przypadki GROUP BY.
  • UNIKALNE ograniczenia.
  • Ograniczenia klucza obcego.
  • Wyszukiwanie FULLTEXT.

Inne odpowiedzi sugerowały, że INSERT / UPDATE / DELETE jest wolniejsze, im więcej masz indeksów. To prawda, ale weź pod uwagę, że wiele zastosowań UPDATE i DELETE ma również klauzule WHERE, aw MySQL, UPDATE i DELETE obsługują również JOIN. Indeksy mogą przynieść tym zapytaniom większe korzyści niż zrekompensować narzut aktualizowania indeksów.

Ponadto InnoDB blokuje wiersze, na które ma wpływ UPDATE lub DELETE. Nazywają to blokowaniem na poziomie wiersza, ale tak naprawdę jest to blokowanie na poziomie indeksu. Jeśli nie ma indeksu do zawężenia wyszukiwania, InnoDB musi zablokować znacznie więcej wierszy niż określony wiersz, który zmieniasz. Może nawet zablokować wszystkie wiersze w tabeli. Te blokady blokują zmiany wprowadzone przez innych klientów, nawet jeśli nie są logicznie sprzeczne.

Kiedy warto dodać indeks?

Jeśli wiesz, że musisz uruchomić zapytanie, które skorzystałoby z indeksu w jednym z powyższych przypadków.

Kiedy dodanie indeksu jest złym pomysłem?

Jeśli indeks jest lewym przedrostkiem innego istniejącego indeksu lub indeks nie pomaga w zadaniu żadnego z zapytań, które musisz uruchomić.

Zalety i Wady wielu indeksów a indeksy wielokolumnowe?

W niektórych przypadkach MySQL może przeprowadzać optymalizację scalania indeksów i sumować lub przecinać wyniki niezależnych wyszukiwań indeksu. Jednak definiowanie pojedynczego indeksu daje lepszą wydajność, więc scalanie indeksów nie musi być wykonywane.

Dla jednego z moich klientów konsultingowych zdefiniowałem indeks wielokolumnowy w tabeli wiele-do-wielu, w której nie było indeksu, i poprawiłem ich zapytanie łączące o 94 miliony!

Projektowanie odpowiednich indeksów jest złożonym procesem opartym na zapytaniach, które należy zoptymalizować . Nie należy tworzyć ogólnych reguł, takich jak „indeksuj wszystko” lub „indeksuj nic, aby uniknąć spowolnienia aktualizacji”.

Zobacz także moją prezentację Jak projektować indeksy, naprawdę .

Bill Karwin
źródło
10
+1 dla „... weź pod uwagę, że wiele zastosowań UPDATE i DELETE ma również klauzule WHERE, aw MySQL, UPDATE i DELETE obsługują również JOIN.
Rob Craig,
1
Powinno to być akceptowaną odpowiedzią, jeśli weźmie się pod uwagę klauzule w aktualizacji i usunięciu.
Leonardo Emilio Dominguez
1
To jest poprawna odpowiedź, ta oznaczona jako poprawna jest błędna.
Eimsas
7

Czy istnieje coś takiego, jak zbyt wiele indeksów?

Indeksy powinny być informowane o występującym problemie: tabelach, zapytaniach, które uruchomi Twoja aplikacja itp.

Co przyspieszą indeksy?

WYBÓR.

Co spowolnią indeksy?

INSERT będzie wolniejszy, ponieważ musisz zaktualizować indeks.

Kiedy warto dodać indeks?

Gdy Twoja aplikacja wymaga kolejnej klauzuli WHERE.

Kiedy dodanie indeksu jest złym pomysłem?

Kiedy nie potrzebujesz go do wysyłania zapytań lub wymuszania ograniczeń unikalności.

Zalety i wady wielu indeksów w porównaniu z indeksami wielokolumnowymi?

Nie rozumiem pytania. Jeśli masz ograniczenie niepowtarzalności, które obejmuje wiele kolumn, z całą pewnością modeluj je jako takie.

duffymo
źródło
4

Czy istnieje coś takiego, jak zbyt wiele indeksów?

Tak. Nie wychodź, aby tworzyć indeksy, utwórz je w razie potrzeby.

Co przyspieszą indeksy?

Wszelkie zapytania dotyczące tabeli / widoku indeksów.

Co spowolnią indeksy?

Wszelkie instrukcje INSERT odnoszące się do tabeli indeksowanej zostaną spowolnione, ponieważ każdy nowy rekord będzie musiał zostać zindeksowany.

Kiedy warto dodać indeks?

Gdy zapytanie nie działa z akceptowalną prędkością. Możesz filtrować rekordy, które nie są częścią klastra PK, w takim przypadku powinieneś dodać indeksy w oparciu o filtry, których szukasz (jeśli wydajność uzna to za stosowne).

Kiedy dodanie indeksu jest złym pomysłem?

Kiedy robisz to ze względu na to - czyli nadmierna optymalizacja.

Zalety i Wady wielu indeksów a indeksy wielokolumnowe?

Zależy od zapytań, które próbujesz poprawić.

RPM1984
źródło
3

Czy istnieje coś takiego, jak zbyt wiele indeksów?

Tak, jak wszystkie rzeczy, zbyt wiele indeksów spowolni manipulację danymi.

Kiedy warto dodać indeks?

Dobrym pomysłem na dodanie indeksu jest sytuacja, gdy zapytania są zbyt wolne (tj. Masz zbyt wiele złączeń w zapytaniach). Tej optymalizacji należy używać dopiero po zbudowaniu solidnego modelu, aby poprawić wydajność.

Daniel Fath
źródło