Czy muszę dodać nowy indeks jednokolumnowy do tabeli, jeśli indeks wielokolumnowy w tym polu już istnieje?


10

Mam tabelę z UNIQUEindeksem 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 BYw tej kolumnie?

(przy 100 milionach wierszy może to chwilę potrwać. Dlatego pytam, zamiast po prostu robić)


Jeśli Twoje prawdziwe pytanie dotyczy powolnego zapytania, podaj POKAŻ UTWÓRZ TABELĘ POKAŻ STAN TABELI POKAŻ ZMIENNE PODOBNE „% buffer%” WYJAŚNIJ WYBIERZ ... Ile pamięci RAM jest dostępne? Istnieje wiele możliwych przyczyn; większość można zauważyć, patrząc na te przedmioty.
Rick James

Odpowiedzi:


5

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 !!!


Jesteś pewny? Ten facet sugeruje inaczej: stackoverflow.com/questions/179085/... czy to różni się od MySQL do MSSQL?
Tadej

4

Indeksy mogą przyspieszyć group byoperacje 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 odpowiednika hash group byoperacji, 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_idzałożenie, że założenie, że jest to jedyna kolumna w group byklauzuli, 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_idbędzie mniejszy niż indeks włączony, job_id, keyword_idjeśli keyword_idnie jest częścią indeksu klastrowanego.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.