sql >> Database >  >> RDS >> Mysql

MySql weigert index te gebruiken

MySQL zal de index niet gebruiken als het schat dat het een aanzienlijk groot deel van de tabel zou selecteren, en het denkt dat een tabelscan in die gevallen eigenlijk efficiënter is.

Dit is naar analogie de reden dat de index van een boek geen veelvoorkomende woorden zoals "de" bevat -- omdat het tijdverspilling zou zijn om het woord in de index op te zoeken en te ontdekken dat de lijst met paginanummers een zeer lange lijst, zelfs elke pagina in het boek. Het zou efficiënter zijn om gewoon het boek van kaft tot kaft te lezen.

Mijn ervaring is dat dit in MySQL gebeurt als de zoekcriteria van een zoekopdracht met meer dan 20% van de tabel overeenkomen, en dit is meestal het juiste kruispunt. Er kan enige variatie zijn op basis van de gegevenstypen, de grootte van de tabel, enz.

Je kunt MySQL een hint geven om het ervan te overtuigen dat een table-scan onbetaalbaar zou zijn, dus het zou veel waarschijnlijker zijn om de index te gebruiken. Dit is meestal niet nodig, maar u kunt het als volgt doen:

SELECT taskid FROM tasktransitions FORCE INDEX (transitiondate_ix)
WHERE transitiondate>'2013-09-31 00:00:00';


  1. MySQL integer veld wordt geretourneerd als string in PHP

  2. Ruby On Rails is traag...?

  3. ORA-28001:Het wachtwoord is verlopen

  4. sqlLiteDatabase.query() voor INNER JOIN