2010-07-29 11 views
6

Kiedy ręcznie utworzę tabele w MySQL, dodam indeksy po jednym na raz dla każdego pola, które myślę, że użyję dla zapytań.Indeksy MySQL: posiadanie wielu indeksów vs. posiadanie jednego klucza wielopolowego?

Kiedy używam phpMyAdmina do tworzenia tabel dla mnie, i wybieram moje indeksy w formularzu tworzenia tabeli, widzę, że phpMyAdmin łączy moje indeksy w 1 (plus moje podstawowe).

Jaka jest różnica? Czy jeden jest lepszy od drugiego? W którym to przypadku?

Dzięki!

Odpowiedz

8

To zależy od twoich zapytań. Niektóre zapytania lepiej wykorzystują indeksy wielokolumnowe, inne nie. EXPLAIN jest twoim przyjacielem.

http://dev.mysql.com/doc/refman/5.6/en/explain.html

również bardzo dobrym źródłem informacji jest tutaj:

http://dev.mysql.com/doc/refman/5.6/en/optimization-indexes.html

+0

Nie napisałem jeszcze żadnego z moich zapytań (tylko na etapie projektowania). Mówiąc ogólnie, nie ma indeksów do później, kiedy mam gotowe zapytania ... –

+1

Niektóre indeksy są dość łatwe do pomyślenia na etapie projektowania, ale większość z nich zostanie dodana podczas tworzenia zapytań. – Mchl

12

Ani to szczególnie dobra strategia, ale gdybym miał wybierać wybrałbym wielokrotne pojedyncze indeksy.

Powodem jest to, że indeksu można używać tylko wtedy, gdy wszystkie pola są w dowolnym pełnym przedrostku indeksu. Jeśli masz indeks (a, b, c, d, e, f), to działa dobrze dla zapytania, które filtruje na a lub kwerendę, która filtruje zarówno na a i b, ale będzie bezużyteczne tylko dla filtrowania zapytań na c.

Nie ma łatwej reguły, która zawsze działa przy wyborze najlepszych indeksów. Musisz spojrzeć na typy zapytań, które tworzysz, i wybrać indeksy, które przyspieszą te konkretne zapytania. Jeśli zastanowisz się dokładnie nad kolejnością kolumn, możesz znaleźć niewielką liczbę indeksów, które będą przydatne dla wielu różnych zapytań. Na przykład, jeśli w jednym zapytaniu filtrujesz zarówno a i b, jak i inne zapytanie filtrujące tylko na b, wtedy indeks dla (b, a) będzie użyteczny dla obu zapytań, ale indeks (a, b) nie będzie.

Powiązane problemy