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

Teure vollständige Tabellenüberprüfung bei Auswahl aller ohne Bedingung

Weitere Informationen finden Sie unter dem folgenden Link

https://dev.mysql.com/doc /refman/8.0/en/table-scan-avoidance.html

Die Ursache für den vollständigen Tabellenscan ist unten

  • Die Tabelle ist so klein, dass es schneller ist, einen Tabellenscan durchzuführen, als sich mit einer Schlüsselsuche herumzuärgern. Dies ist üblich bei Tabellen mit weniger als 10 Zeilen und einer kurzen Zeilenlänge.

  • Es gibt keine verwendbaren Einschränkungen in der ON- oder WHERE-Klausel für indizierte Spalten.

  • Sie vergleichen indizierte Spalten mit konstanten Werten und MySQL hat (basierend auf dem Indexbaum) berechnet, dass die Konstanten einen zu großen Teil der Tabelle abdecken und dass ein Tabellenscan schneller wäre

  • Sie verwenden einen Schlüssel mit niedriger Kardinalität (viele Zeilen stimmen mit dem Schlüsselwert überein) über eine andere Spalte. In diesem Fall geht MySQL davon aus, dass es durch die Verwendung des Schlüssels wahrscheinlich viele Schlüsselsuchen durchführen wird und dass ein Tabellenscan schneller wäre.

Um einen vollständigen Tabellenscan zu vermeiden, verwenden Sie Folgendes:

  • Verwenden Sie ANALYZE TABLE tbl_name, um die Schlüsselverteilungen für die gescannte Tabelle zu aktualisieren.

  • Verwenden Sie FORCE INDEX für die gescannte Tabelle, um MySQL mitzuteilen, dass Tabellenscans im Vergleich zur Verwendung des angegebenen Index sehr teuer sind:

    z.B. SELECT * FROM t1, t2 FORCE INDEX (index_for_column)WHERE t1.col_name=t2.col_name;