Während der Untersuchung eines Problems mit der SQL-Abfrageleistung versuchte der Benutzer, die Abfrage zu optimieren, indem er einen Index zur Spalte „products.name“ hinzufügte definiert als varchar(512). Der ursprüngliche Index, der als „product_name_idx (name(512))“ angegeben wurde, führte dazu, dass der Index nicht zum Sortieren verwendet wurde, da er als Präfixindex identifiziert wurde.
Um dieses Problem zu beheben, hat der Benutzer versucht, die Namensspalte abzuschneiden zu varchar(255). Nach dieser Änderung zeigte die nachfolgende EXPLAIN-Anweisung an, dass ein Index verwendet wurde.
Dieses Verhalten ergibt sich aus der Annahme, die MySQL hinsichtlich der Länge von UTF-8-Zeichen macht. In MySQL beträgt die maximale Indexgröße für eine einzelne Spalte 767 Byte. Vor MySQL 8.0 war der utf8-Zeichensatz auf maximal 3 Bytes pro Zeichen beschränkt. Mit MySQL 8.0 hat sich dies jedoch geändert, und utf8mb3 ist nun veraltet und wird durch utf8mb4 ersetzt, das bis zu 4 Bytes pro Zeichen unterstützt.
In MySQL-Versionen vor 8.0 wird eine Indexlänge angegeben, die größer als der Standardwert ist 255 Zeichen für eine varchar(255)-Spalte würden zu einem Fehler führen. Dies liegt daran, dass MySQL für UTF-8 von 3 Bytes pro Zeichen ausgeht und ein 256-Zeichen-Index die 767-Byte-Grenze überschreiten würde.
Mit MySQL 8.0 und dem Zeichensatz utf8mb4 gilt weiterhin die Annahme von 3 Bytes pro Zeichen . Mit der Einführung komprimierter und dynamischer Zeilenformate können Indexschlüsselpräfixe jedoch bis zu 3072 Byte lang sein. Dadurch können Indizes für Varchar-Spalten mit einer größeren Anzahl von Zeichen erstellt werden.
Zusammenfassend lässt sich sagen, dass in früheren MySQL-Versionen die Indexlängenbeschränkung für Varchar-Spalten aufgrund der Annahme von 3 Byte pro Zeichen 255 Zeichen betrug UTF-8-Zeichen und die maximale Indexgröße von 767 Byte. Mit MySQL 8.0 und utf8mb4 wurde dieser Grenzwert für komprimierte und dynamische Zeilenformate gelockert, was längere Indizes für Varchar-Spalten ermöglicht.
Das obige ist der detaillierte Inhalt vonWarum unterscheidet sich die varchar-Indexlängenbeschränkung von MySQL zwischen den Versionen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!