Czy MySQL może używać wielu indeksów dla jednego zapytania?
Wyobraź sobie tabelę z wieloma kolumnami, powiedzmy, id, a, b, c, d, e
. Zazwyczaj wybieram przez id
, jednak w aplikacji klienckiej jest wiele zapytań, które używają różnych warunków w podzbiorach kolumn.
Kiedy MySQL wykonuje zapytanie na jednej tabeli z wieloma warunkami WHERE na wielu kolumnach, czy naprawdę może korzystać z indeksów utworzonych na różnych kolumnach? Czy jedynym sposobem, aby zrobić to szybko, jest tworzenie wielokolumnowych indeksów dla wszystkich możliwych zapytań?
2 answers
Tak, MySQL może używać wielu indeksów dla jednego zapytania. Optymalizator określi, które indeksy będą korzystne dla zapytania. Możesz użyć EXPLAIN
, Aby uzyskać informacje o tym, jak MySQL wykonuje instrukcję. Możesz dodawać lub ignorować indeksy za pomocą podpowiedzi w następujący sposób:
SELECT * FROM t1 USE INDEX (i1) IGNORE INDEX FOR ORDER BY (i2) ORDER BY a;
Proponuję poczytać o jak MySQL używa indeksów .
Tylko kilka fragmentów:
Jeśli istnieje wybór pomiędzy wieloma indeksami, MySQL zwykle używa indeks, który znajduje najmniejszy liczba wierszy.
Jeśli istnieje indeks wielokolumnowy na col1 i col2, odpowiednie wiersze można pobierać bezpośrednio. Jeśli istnieją oddzielne indeksy jednokolumnowe na col1 i col2 optymalizator spróbuje użyć scalania indeksu optymalizacja (zob. sekcja 8.3.1.4, "Optymalizacja scalania indeksów"), lub spróbuj znaleźć najbardziej restrykcyjny indeks, decydując, który indeks znajduje mniej wierszy i używa tego indeksu do pobierania wierszy.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-31 21:30:13
Klasycznie, MySQL może używać jednego indeksu na odniesienie do tabeli w danym zapytaniu. Jednak w nowszych wersjach MySQL operacja o nazwie index merge
może mieć miejsce i pozwolić MySQL na użycie więcej niż jednego indeksu na tabelę.
Http://openquery.com/blog/mysql-50-index-merge-using-multiple-indexes
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-25 16:32:41