Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Pokrycie MySQL vs indeks złożony vs indeks kolumn

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zresetuj hasło root serwera MySQL

  2. Kiedy używać MyISAM i InnoDB?

  3. 2 sposoby na wyświetlenie wszystkich procedur składowanych w MySQL

  4. MySQL otrzymuje pozycję wiersza w ORDER BY

  5. Szybkie spojrzenie na funkcje numeryczne SQL Server