sql >> Database >  >> RDS >> Mysql

Mysql-dekking versus composiet versus kolomindex

Een dekkingsindex is niet hetzelfde als een samengestelde index.

Als ik 2 afzonderlijke indexen heb, de ene op col3 en de andere op col4, welke wordt dan in deze query gebruikt?

De index met de hoogste kardinaliteit.
MySQL houdt statistieken bij over welke index welke eigenschappen heeft.
De index die het meest onderscheidend vermogen heeft (zoals blijkt uit de MySQL-statistieken) zal worden gebruikt.

Ik heb ergens gelezen dat voor elke tabel in de query slechts één index wordt gebruikt. Betekent dit dat de query op geen enkele manier beide indexen kan gebruiken?

U kunt een subselectie gebruiken.
Of nog beter een samengestelde index gebruiken die zowel col3 als col4 bevat.

Ten tweede, als ik een samengestelde index heb gemaakt met zowel col3 als col4 samen, maar alleen col3 in de WHERE-clausule heb gebruikt, zal dat dan slechter zijn voor de prestaties? voorbeeld:

Samengestelde index
De juiste term is compound index, niet samengesteld.
Alleen de meest linkse een deel van de samengestelde index wordt gebruikt.
Dus als de index is gedefinieerd als

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

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

Merk op dat als je een veld uiterst links selecteert, je weg kunt komen door dat deel van de index niet te gebruiken in je waar-clausule.
Stel je voor dat we een samengestelde index hebben

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.  

De reden dat dit werkt, is dat de eerste query de dekkingsindex gebruikt en daarop een scan uitvoert.
De tweede query moet toegang hebben tot de tabel en daarom heeft het scannen van de index geen zin.
Dit werkt alleen in InnoDB.

Wat is een dekkingsindex
Een dekkingsindex verwijst naar het geval waarin alle velden die in een zoekopdracht zijn geselecteerd, covered zijn door een index, in dat geval zal InnoDB (niet MyISAM) de gegevens in de tabel nooit lezen, maar alleen de gegevens in de index gebruiken, waardoor de selectie aanzienlijk wordt versneld.
Merk op dat in InnoDB de primaire sleutel is opgenomen in alle secundaire indexen, dus in zekere zin zijn alle secundaire indexen samengestelde indexen.
Dit betekent dat als u de volgende query uitvoert op InnoDB:

SELECT indexed_field FROM table1 WHERE pk = something

MySQL zal altijd een dekkingsindex gebruiken en heeft geen toegang tot de eigenlijke tabel. Hoewel het een dekkingsindex zou kunnen gebruiken, zal het de voorkeur geven aan de PRIMARY KEY omdat het maar één rij hoeft te raken.



  1. Oracle INTERSECT-operator uitgelegd

  2. UNION- en LIMIT-bewerkingen combineren in MySQL-query

  3. MySQL select statement met CASE of IF ELSEIF? Weet niet hoe je het resultaat krijgt

  4. Is ODP.NET vereist voor Oracle 11g Client?