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ń?

Author: kolypto, 2012-09-01

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.

 50
Author: Kermit,
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

 16
Author: Chris Henry,
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