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) = ...
select
scalania indeksów. percona.com/blog/2012/12/14/…Nie zgadzam się z niektórymi odpowiedziami na to pytanie.
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.
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.
Jeśli wiesz, że musisz uruchomić zapytanie, które skorzystałoby z indeksu w jednym z powyższych przypadków.
Jeśli indeks jest lewym przedrostkiem innego istniejącego indeksu lub indeks nie pomaga w zadaniu żadnego z zapytań, które musisz uruchomić.
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ę .
źródło
Indeksy powinny być informowane o występującym problemie: tabelach, zapytaniach, które uruchomi Twoja aplikacja itp.
WYBÓR.
INSERT będzie wolniejszy, ponieważ musisz zaktualizować indeks.
Gdy Twoja aplikacja wymaga kolejnej klauzuli WHERE.
Kiedy nie potrzebujesz go do wysyłania zapytań lub wymuszania ograniczeń unikalności.
Nie rozumiem pytania. Jeśli masz ograniczenie niepowtarzalności, które obejmuje wiele kolumn, z całą pewnością modeluj je jako takie.
źródło
Tak. Nie wychodź, aby tworzyć indeksy, utwórz je w razie potrzeby.
Wszelkie zapytania dotyczące tabeli / widoku indeksów.
Wszelkie instrukcje INSERT odnoszące się do tabeli indeksowanej zostaną spowolnione, ponieważ każdy nowy rekord będzie musiał zostać zindeksowany.
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 robisz to ze względu na to - czyli nadmierna optymalizacja.
Zależy od zapytań, które próbujesz poprawić.
źródło
Tak, jak wszystkie rzeczy, zbyt wiele indeksów spowolni manipulację danymi.
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ść.
źródło