Jeśli utworzyć dwa następujące indeksyKolejność, w jakiej tworzone są wskaźniki, wpływa na indeks wybrany przez optymalizator zapytań?
ALTER TABLE requests ADD INDEX daily_ips(exec_date, ip_address);
ALTER TABLE requests ADD INDEX is_cached(exec_date, cached);
Wyjście show index from requests
jest następujący
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
requests 1 daily_ips 1 exec_date A 413 NULL NULL YES BTREE
requests 1 daily_ips 2 ip_address A 218334 NULL NULL YES BTREE
requests 1 is_cached 1 exec_date A 165 NULL NULL YES BTREE
requests 1 is_cached 2 cached A 165 NULL NULL YES BTREE
Mam następujące zapytanie
EXPLAIN SELECT exec_date,
100 * SUM(CASE WHEN cached = 'no' THEN 1 ELSE 0 END)/SUM(1) cached_no,
100 * SUM(CASE WHEN cached != 'no' THEN 1 ELSE 0 END)/SUM(1) cached_yes
FROM requests
GROUP BY exec_date;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE requests index NULL daily_ips 263 NULL 436695
Jednak chciałbym zmusić zapytanie optymalizator do korzystania z indeksu is_cached
zamiast indeksu daily_ips
.
Jeśli usunąć indeks daily_ips
i dodać go ponownie
ALTER TABLE requests DROP INDEX daily_ips;
ALTER TABLE requests ADD INDEX daily_ips(exec_date, ip_address);
Następnie uruchom samą EXPLAIN
oświadczenie, optymalizator kwerendy wybiera indeks is_cached
.
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE requests index NULL is_cached 6 NULL 440493 Using index
Czy oczekuje się, że optymalizator zapytań wybierze indeks na podstawie kolejności, w jakiej został dodany?
Jak określić optymalizator zapytań, którego indeksu użyć?
Uważam, że indeks jest używany tylko do skanowania tabeli. Jeśli chcesz faktycznie korzystać z indeksu, przeinstaluj go na dwa zapytania, które liczą się z warunkiem, który jest w pamięci podręcznej. (Choć bufor musi być pierwszym kluczem w indeksie oczywiście.) Zasadniczo CASE powoduje wykonanie skanowania tabeli. – Corbin
Zaktualizowałem moją odpowiedź, sprawdzając, czy –
@Corbin Nie jestem pewien, czy rozumiem, w jaki sposób chciałbym wykonać polecenie, które polecasz. Jak dokładnie mogę zrestrukturyzować zapytanie na 2 zapytania (jakikolwiek przykładowy kod byłby mile widziany)? – user784637