Indeks pokrycia to nie to samo, co indeks złożony.
Jeśli mam 2 oddzielne indeksy, jeden na col3, a drugi na col4, który z nich zostanie użyty w tym zapytaniu?
Indeks o największej liczności.
MySQL prowadzi statystyki dotyczące tego, który indeks ma jakie właściwości.
Wykorzystany zostanie indeks, który ma największą moc dyskryminacyjną (jak widać w statystykach MySQL).
Czytałem gdzieś, że dla każdej tabeli w zapytaniu używany jest tylko jeden indeks. Czy to oznacza, że zapytanie nie może użyć obu indeksów?
Możesz użyć podselekcji.
A jeszcze lepiej użyć indeksu złożonego, który zawiera zarówno col3, jak i col4.
Po drugie, jeśli utworzyłem indeks złożony, używając jednocześnie col3 i col4, ale użyłem tylko col3 w klauzuli WHERE, czy będzie to gorsze dla wydajności? przykład:
Indeks złożony
Prawidłowy termin to compound
indeks, a nie złożony.
Tylko najbardziej od lewej część indeksu złożonego zostanie użyta.
Więc jeśli indeks jest zdefiniowany jako
index myindex (col3, col4) <<-- will work with your example.
index myindex (col4, col3) <<-- will not work.
Zobacz:http://dev.mysql.com /doc/refman/5.0/en/multiple-column-indexes.html
Pamiętaj, że jeśli wybierzesz pole znajdujące się najbardziej po lewej stronie, możesz uniknąć używania tej części indeksu w klauzuli where.
Wyobraź sobie, że mamy indeks złożony
Myindex(col1,col2)
SELECT col1 FROM table1 WHERE col2 = 200 <<-- will use index, but not efficiently
SELECT * FROM table1 where col2 = 200 <<-- will NOT use index.
Powodem, dla którego to działa, jest to, że pierwsze zapytanie używa indeksu pokrywającego i wykonuje jego skanowanie.
Drugie zapytanie musi uzyskać dostęp do tabeli iz tego powodu skanowanie indeksu nie ma sensu.
To działa tylko w InnoDB.
Co to jest indeks pokrycia
Indeks pokrywający odnosi się do przypadku, gdy wszystkie pola wybrane w zapytaniu są covered
przez indeks, w takim przypadku InnoDB (nie MyISAM) nigdy nie odczyta danych z tabeli, a jedynie użyje danych z indeksu, znacznie przyspieszając wybór.
Zauważ, że w InnoDB klucz podstawowy jest zawarty w wszystkie indeksy drugorzędne, czyli w pewnym sensie wszystkie indeksy drugorzędne są indeksami złożonymi.
Oznacza to, że jeśli uruchomisz następujące zapytanie w InnoDB:
SELECT indexed_field FROM table1 WHERE pk = something
MySQL zawsze będzie używał indeksu pokrywającego i nie będzie miał dostępu do rzeczywistej tabeli. Chociaż może używać indeksu pokrywającego, preferuje PRIMARY KEY
ponieważ wystarczy trafić tylko w jeden rząd.