Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL weigert sich, den Index zu verwenden

MySQL wird den Index nicht verwenden, wenn es davon ausgeht, dass es einen erheblich großen Teil der Tabelle auswählen würde, und es der Meinung ist, dass ein Tabellen-Scan in diesen Fällen tatsächlich effizienter ist.

Dies ist analog der Grund, warum der Index eines Buches keine sehr gebräuchlichen Wörter wie "the" enthält - weil es Zeitverschwendung wäre, das Wort im Index nachzuschlagen und zu finden, dass die Liste der Seitenzahlen a ist sehr lange Liste, sogar jede Seite im Buch. Es wäre effizienter, einfach das Buch von vorne bis hinten zu lesen.

Meiner Erfahrung nach passiert dies in MySQL, wenn die Suchkriterien einer Abfrage mit mehr als 20 % der Tabelle übereinstimmen, und dies ist normalerweise der richtige Übergangspunkt. Je nach Datentypen, Tabellengröße usw. kann es zu Abweichungen kommen.

Sie können MySQL einen Hinweis geben, um es davon zu überzeugen, dass ein Tabellenscan unerschwinglich teuer wäre, sodass es viel wahrscheinlicher wäre, den Index zu verwenden. Dies ist normalerweise nicht notwendig, aber Sie können es so machen:

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