sql >> Databasteknik >  >> RDS >> Mysql

Mysql-täckning vs sammansatt vs kolumnindex

Ett täckande index är inte detsamma som ett sammansatt index.

Om jag har två separata index, ett på col3 och det andra på col4, vilket av dem kommer att användas i den här frågan?

Indexet med högst kardinalitet.
MySQL för statistik över vilket index som har vilka egenskaper.
Det index som har den mest särskiljande kraften (vilket framgår av MySQL:s statistik) kommer att användas.

Jag läste någonstans att för varje tabell i frågan används endast ett index. Betyder det att det inte finns något sätt för frågan att använda båda indexen?

Du kan använda ett underval.
Eller ännu hellre använd ett sammansatt index som inkluderar både col3 och col4.

För det andra, om jag skapade ett sammansatt index med både col3 och col4 tillsammans men bara använde col3 i WHERE-satsen blir det sämre för prestandan? exempel:

Sammansatt index
Rätt term är compound index, inte sammansatt.
Endast den längst till vänster en del av det sammansatta indexet kommer att användas.
Så om indexet är definierat som

index myindex (col3, col4)  <<-- will work with your example.
index myindex (col4, col3)  <<-- will not work. 

Se:http://dev.mysql.com /doc/refman/5.0/en/multiple-column-indexes.html

Observera att om du väljer ett fält längst till vänster kan du komma undan med att inte använda den delen av indexet i din where-sats.
Tänk dig att vi har ett sammansatt index

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.  

Anledningen till att detta fungerar är att den första frågan använder det täckande indexet och gör en skanning av det.
Den andra frågan måste komma åt tabellen och av den anledningen skannar indexet inte meningsfullt.
Detta fungerar bara i InnoDB.

Vad är ett täckande index
Ett täckande index hänvisar till fallet när alla fält som valts i en fråga är covered av ett index, i så fall kommer InnoDB (inte MyISAM) aldrig att läsa data i tabellen, utan bara använda data i index, vilket avsevärt påskyndar urvalet.
Observera att i InnoDB ingår primärnyckeln i alla sekundära index, så på ett sätt är alla sekundära index sammansatta index.
Detta betyder att om du kör följande fråga på InnoDB:

SELECT indexed_field FROM table1 WHERE pk = something

MySQL kommer alltid att använda ett täckande index och kommer inte åt den faktiska tabellen. Även om den kan använda ett täckande index, kommer den att föredra PRIMARY KEY eftersom den bara behöver träffa en enda rad.



  1. Fel i MySQL vid inställning av standardvärde för DATE eller DATETIME

  2. 6 sätt att lägga till en månad till ett datum i MariaDB

  3. PHP - Säkra sidor endast för medlemmar med ett inloggningssystem

  4. Varför använda en LÄS UNENGÅNGAD isoleringsnivå?