Mam tabelę z UNIQUE
indeksem wielokolumnowym na _job_id__
i __keyword_id__
.
Czy musiałbym również dodać kolejny indeks, __job_id__
jeśli mam częste zapytanie, które wykonuje GROUP BY
w tej kolumnie?
(przy 100 milionach wierszy może to chwilę potrwać. Dlatego pytam, zamiast po prostu robić)
Odpowiedzi:
Nie, wcale nie !!! Optymalizator zapytań MySQL zrobi właściwą rzecz, jeśli główna kolumna (kolumny) jest najbardziej w lewo w indeksie. Jeśli utworzyłeś taki indeks, Optymalizator zapytań MySQL może zdecydować, aby nigdy nie używać tego indeksu, jeśli zawsze wykonujesz GROUP BY id_zadania, id_słowa. Optymalizator zapytań MySQL może, ale nie musi, używać indeksu, jeśli zbierasz rekordy tylko według job_id, ale i tak masz nadmiarowy indeks marnujący miejsce.
Jeśli tabelą jest MyISAM, utworzenie takiego indeksu po prostu nadęłoby plik MYI.
Jeśli tabela ma wartość InnoDB, a tabela pliku_wnodb_pera ma wartość 0, utworzenie takiego indeksu spowodowałoby po prostu rozdęcie ibdata1.
Jeśli tabelą jest InnoDB, a tabelka_pliku_wnodb ma wartość 1, utworzenie takiego indeksu spowodowałoby po prostu nadmuchanie pliku .ibd tabeli.
Podsumowując, nie musisz tworzyć tego dodatkowego indeksu !!!
źródło
Indeksy mogą przyspieszyć
group by
operacje tylko poprzez zmniejszenie sortowania - będzie to bardziej wydajne, jeśli użyty indeks będzie indeksem klastrowanym lub przynajmniej będzie miał tę samą wiodącą kolumnę co indeks klastrowany. W tym wszystkim zakładam, że MySQL nie ma odpowiednikahash group by
operacji, która zwykle w ogóle pomijałaby jakąkolwiek korzyść z indeksów - może ktoś inny może to potwierdzić.Zaletą oddzielnego indeksu jest
job_id
założenie, że założenie, że jest to jedyna kolumna wgroup by
klauzuli, a indeks indeks klastrowany nie jest znaczący: indeks będzie mniejszy, a zatem jego skanowanie wygeneruje mniej operacji we / wy--EDYTOWAĆ--
Ponieważ indeks zawiera wszystkie pola klucza podstawowego zdefiniowane dla klucza klastrowanego, które nie znajdują się w indeksie dodatkowym , indeks włączony
job_id
będzie mniejszy niż indeks włączony,job_id, keyword_id
jeślikeyword_id
nie jest częścią indeksu klastrowanego.źródło