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

So fügen Sie Wettervorhersagen in Ihre Website ein

Wir hoffen, dass wir durch die Einbindung der Wet...

Detaillierte Erläuterung des Apache SkyWalking-Alarmkonfigurationshandbuchs

Apache SkyWalking Apache SkyWalking ist ein Tool ...

Eine gute Möglichkeit, Ihre Designfähigkeiten zu verbessern

Sogenanntes Talent (linke und rechte Gehirnhälfte...

Einführung in mögliche Probleme nach der Installation von Tomcat

1. Der Tomcat-Dienst ist nicht geöffnet Geben Sie...

Aktivieren und Konfigurieren des MySQL-Protokolls für langsame Abfragen

Einführung Das MySQL-Protokoll für langsame Abfra...

Detaillierte Erklärung zur Installation und Verwendung von Vue-Router

Inhaltsverzeichnis Installieren Grundlegende Konf...

Einführung in die Verwendung des HTML-Elements Noscript

Noscript-Definition und -Verwendung Das Noscript-...

So erstellen Sie Ihre erste React-Seite

Inhaltsverzeichnis Was ist Rract? Hintergrund Rea...

Lösung zum Vergessen des MySQL-Datenbankkennworts unter MAC

Schnelle Lösung zum Vergessen des MySQL-Datenbank...

Ein tiefer Einblick in JavaScript-Promises

Inhaltsverzeichnis 1. Was ist Promise? 2. Warum g...

Tutorial zur Installation von VMware Workstation 14 Pro unter Ubuntu 16.04

In diesem Artikel wird die spezifische Methode zu...

Erläuterung des Prinzips des MySQL-Replikationsmechanismus

Hintergrund Bei der Replikation handelt es sich u...