Jan 08 2009
Index na wielu polach, a kolejność tych pól
Dzisiaj walczyłem z dość prostym, aczkolwiek powolnym zapytaniem SQL. Problem pewnie polegał na tym, że dane były pobierane z tabeli o ~50k rekordach, sortowane, grupowane itd.
Owe zapytanie wyglądało mniej więcej tak:
Co ciekawe to zapytanie było strasznie powolne - czas wykonania 1,7s. Dodatkowo zapytanie EXPLAIN dobiło faktem, że zapytanie typu SIMPLE musi wykorzystywać tabele tymczasową.
Aby całość przyspieszyć założono indeks na pola firstname i lastname
Oraz odpowiednio zmodyfikowaliśmy zapytanie:
Całość działała poprawnie i, co najważniejsze, szybko. Okazało się, że zapytanie ma jedną wadę. Sortowanie ma być najpierw po polu lastname, a potem po polu firstname. Okazuje się, że prosta zamiana kolejnością pól w wyrażeniu ORDER BY skutkuje spowolnieniem czasu wykonywania.
Fakt, czy będziemy grupować najpierw po polu firstname, a później po polu lastname nie miał znaczenia, dlatego postanowiono na zamianę kolejności tych pól, oraz poprawienie indeksu.
Dodatkowo drobna zmiana zapytania na:
I całość śmiga, aż miło :)
Okazuje się, że dla serwera MySQL kolejność pól w zakładanym indeksie ma wpływ na późniejszy czas wykonywania zapytań.
