Lösung für „Spezialisierter Schlüssel war zu lang“ in MySQL

Lösung für „Spezialisierter Schlüssel war zu lang“ in MySQL

Beim Erstellen einer Tabelle stieß ich auf ein interessantes Problem. Die Meldung „Angegebener Schlüssel war zu lang; die maximale Schlüssellänge beträgt 767 Bytes“ erschien. Aus der Beschreibung geht hervor, dass der Schlüssel zu lang ist und das angegebene Limit von 767 Bytes überschreitet.

Unten sehen Sie die Tabellenstruktur, die das Problem verursacht

CREATE TABLE `test_table` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(1000) NICHT NULL STANDARD '',
  `link` varchar(1000) NICHT NULL STANDARD '',
  Primärschlüssel (`id`),
  SCHLÜSSEL `Name` (`Name`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

Wir können sehen, dass wir für den Namen die Länge auf 1000 variable Zeichen festgelegt haben. Da die utf8mb4-Kodierung verwendet wird, beträgt die Größe 1000 * 4 > 767
Daher sollte die Länge von varchar ohne Änderung anderer Konfigurationen 767 / 4 = 191 betragen.

Interessierte Studenten können es testen Specified key was too long; max key length is 767 bytes

Lösung 1

  • Verwenden der InnoDB-Engine
  • Aktivieren Sie die Option innodb_large_prefix und ändern Sie die Einschränkung, um sie auf 3072 Bytes zu erweitern
  • Erstellen Sie die Datenbank neu

my.cnf-Konfiguration

Setzen Sie global innodb_large_prefix=on;
Setzen Sie global innodb_file_per_table=on;
Setzen Sie global innodb_file_format=BARRACUDA;
Setzen Sie global innodb_file_format_max=BARRACUDA;

Der Grund für die obigen 3072 Bytes ist wie folgt

Wir wissen, dass die Standardgröße einer InnoDB-Seite 16 KB beträgt. Da es sich um eine Btree-Organisation handelt, muss eine Seite auf einem Blattknoten mindestens zwei Datensätze enthalten (andernfalls verkommt sie zu einer verknüpften Liste).
Daher kann ein Datensatz die Größe von 8 KB nicht überschreiten. Aufgrund der gruppierten Indexstruktur von InnoDB muss ein Sekundärindex den Primärschlüsselindex enthalten, sodass jeder einzelne Index 4 KB nicht überschreiten kann (in Extremfällen erreichen sowohl pk als auch ein Sekundärindex diese Grenze).
Aufgrund des Bedarfs an reserviertem und zusätzlichem Speicherplatz kann die Zahl nach Abzug 3500 nicht überschreiten, die „Ganzzahl“ beträgt also (1024*3).

Lösung 2

Fügen Sie beim Erstellen einer Tabelle row_format=DYNAMIC hinzu

CREATE TABLE `test_table` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NICHT NULL STANDARD '',
  `link` varchar(255) NICHT NULL STANDARD '',
  Primärschlüssel (`id`),
  SCHLÜSSEL `Name` (`Name`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 row_format=DYNAMISCH;

Die Funktion dieses Parameters ist wie folgt

MySQL-Indizes unterstützen nur 767 Bytes, und jedes Zeichen in utf8mb4 belegt 4 Bytes, sodass die maximale Länge des Indexes nur 191 Zeichen betragen kann, also varchar(191). Wenn Sie ein größeres Feld verwenden möchten, muss MySQL so eingestellt werden, dass es die Datenkomprimierung unterstützt, und das Tabellenattribut row_format ={DYNAMIC|COMPRESSED} ändern.

Dies ist das Ende dieses Artikels über die Lösung des Problems, dass der MySQL-Index zu lang ist. Weitere Informationen zum Problem, dass der MySQL-Index zu lang ist, finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Grundlegendes zu MySQL-Clusterindizes und wie Clusterindizes wachsen
  • Analyse des Prinzips der MySQL-Indexlängenbeschränkung

<<:  Eine Sammlung gängiger Verwendungen von HTML-Meta-Tags

>>:  Fortgeschrittene Techniken zur Verwendung von CSS (im tatsächlichen Kampf verwendet)

Artikel empfehlen

mysql: [FEHLER] unbekannte Option '--skip-grant-tables'

MySQL-Datenbank meldet FEHLER 1045 (28000): Zugri...

DOCTYPE Dokumenttypdeklaration (unbedingt lesenswert für Webseiten-Liebhaber)

DOCTYPE-DEKLARATION: Oben auf jeder Seite, die Sie...

So verwenden Sie async und await in JS

Inhaltsverzeichnis 1. asynchron 2. warten: 3. Umf...

js realisiert die Lupenfunktion der Shopping-Website

In diesem Artikel wird der spezifische Code von j...

Index-Skip-Scan in MySQL 8.0

Vorwort MySQL 8.0.13 unterstützt nun den Index-Sk...

Bootstrap 3.0 Studiennotizen Grid-System-Fall

Vorwort Im vorherigen Artikel haben wir hauptsäch...

So ändern Sie die Standardspeicher-Engine in MySQL

MySQL-Speicher-Engine: Der MySQL-Server verwendet...

Detaillierte Erklärung von Objektliteralen in JS

Inhaltsverzeichnis Vorwort 1. Setzen Sie den Prot...

Methode zum Schreiben von bedingten Kommentaren und Beispielcode

Als Front-End-Ingenieure müssen wir mit dem IE ve...

Vue implementiert die Funktion zum Aufrufen der Handykamera und des Albums

In diesem Artikel wird der spezifische Code von V...

Verwendung des Fokus-innerhalb-Selektors von CSS3

Pseudoelemente und Pseudoklassen Apropos, schauen...

Problem beim Testen des nicht autorisierten Zugriffs auf Zookeeper

Inhaltsverzeichnis Vorwort Erkennen des geöffnete...