sql >> Databasteknik >  >> RDS >> Mysql

MySql vägrar att använda index

MySQL kommer inte att använda indexet om det uppskattar att det skulle välja en avsevärt stor del av tabellen, och det tror att en tabellskanning faktiskt är mer effektiv i dessa fall.

I analogi är detta anledningen till att indexet för en bok inte innehåller särskilt vanliga ord som "the" -- eftersom det skulle vara ett slöseri med tid att slå upp ordet i indexet och hitta listan med sidnummer är en mycket lång lista, till och med varje sida i boken. Det skulle vara mer effektivt att helt enkelt läsa boken pärm till pärm.

Min erfarenhet är att detta händer i MySQL om en frågas sökkriterier skulle matcha mer än 20% av tabellen, och detta är vanligtvis rätt övergångspunkt. Det kan finnas vissa variationer baserat på datatyperna, tabellens storlek, etc.

Du kan ge en ledtråd till MySQL för att övertyga den om att en tabellsökning skulle vara oöverkomligt dyr, så det skulle vara mycket mer sannolikt att använda indexet. Detta är vanligtvis inte nödvändigt, men du kan göra det så här:

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


  1. Det gick inte att ansluta till MySQL på localhost:3306 med användarrot

  2. Vad betyder ett kolon före en bokstavlig i en SQL-sats?

  3. Fackliga frågor från olika databaser i Laravel Query Builder

  4. hur man väljer fält från olika db:s med samma tabell och fältnamn