Detaillierte Erläuterung der MySQL-Datenzeilen und des Zeilenüberlaufmechanismus

Detaillierte Erläuterung der MySQL-Datenzeilen und des Zeilenüberlaufmechanismus

1. Welche Zeilenformate gibt es?

Sie können Ihre MySQL-Zeilenformateinstellungen wie folgt sehen.

Tatsächlich haben MySQL-Datenzeilen zwei Formate, eines ist das in der Abbildung gezeigte Kompaktformat und das andere ist das redundante Format.

„Kompakt“ ist ein kompaktes Zeilenformat, das dazu dient, mehrere Datenzeilen auf einer Datenseite zu speichern.

Denken Sie darüber nach, es ist so aufregend, mehr Datenzeilen auf einer Datenseite speichern zu können. MySQL liest Daten von der Festplatte in Datenseiten. Wenn wir mehr Zeilen auf einer Datenseite speichern können, würde das nicht weniger Platz verbrauchen und die Gesamteffizienz steigern?

Einführung auf der offiziellen Website: Durch die Kompaktheit können Sie im Vergleich zum redundanten Format 20 % Speicherplatz sparen.

Compact wurde in MySQL 5.0 eingeführt. Ab MySQL 5.1 ist das Zeilenformat standardmäßig auf Compact eingestellt. Daher wird in diesem Artikel auch das Compact-Format beschrieben.

2. Wie sieht das kompakte Zeilenformat aus?

Sie müssen wissen, dass einige Spalten in der Tabelle Nullwerte zulassen und einige Spalten Varchar-Typen mit variabler Länge sind.

Wie organisiert und beschreibt das kompakte Zeilenformat diese Informationen? Wie unten dargestellt:

Jeder Teil kann mehr Daten enthalten als die 1, 2 und 3, die ich oben markiert habe.

Um Ihnen ein intuitiveres Gefühl und Verständnis zu vermitteln, habe ich nur einen Teil herausgesucht, den ich Ihnen zeigen möchte.

3. Wie viele Daten kann eine einzelne MySQL-Zeile speichern?

In den MySQL-Einstellungen kann eine einzelne Datenzeile maximal 65535 Byte Daten speichern (beachten Sie, dass es sich um Bytes und nicht um Zeichen handelt).

Beim Erstellen einer Datentabelle wie dieser tritt jedoch ein Fehler auf:

MySQL erlaubt es Ihnen nicht, eine Spalte mit einer Länge von 65535 Bytes zu erstellen, da jede Zeile auf der Datenseite die in der obigen Abbildung erwähnte ausgeblendete Spalte hat.

Reduzieren Sie daher die Länge von varchar auf 65532 Bytes, um die Tabelle erfolgreich zu erstellen.

Beachten Sie, dass sich 65535 hier auf Bytes und nicht auf Zeichen bezieht.

Wenn Sie also den Zeichensatz auf UTF-8 ändern, bezieht sich das N in varchar(N) tatsächlich auf N Zeichen und nicht auf N Bytes. Wenn Sie also eine Tabelle wie unten erstellen, wird eine Fehlermeldung angezeigt.

Wenn encode=utf8, stellen drei Bytes ein Zeichen dar. Dann 65535 / 3 = 21845 Zeichen.

4. Wie ist das Compact-Format so kompakt?

MySQL führt jedes Mal zufällige IO-Lesevorgänge durch

Standardmäßig beträgt die Datenseitengröße 16 KB. Eine Datenseite speichert mehrere Zeilen.

Bedeutet dies, dass MySQL insgesamt weniger IO-Vorgänge ausführen muss, je mehr Datenzeilen in einer Datenseite gespeichert werden können? Je schneller die Leistung?

Die Implementierungsidee des kompakten Formats lautet: Wenn der Spaltentyp VARCHAR, VARBINARY, BLOB oder TEXT ist, werden die Daten in der Spalte, die 768 Byte überschreiten, auf anderen Datenseiten abgelegt.

Wie unten dargestellt:

Ist Ihnen jetzt die ganze Geschichte klar?

Auf diese Weise verhindert MySQL wirksam die Situation, dass eine einzelne Varchar- oder Textspalte zu groß ist, was dazu führt, dass auf einer einzelnen Datenseite zu wenige Zeilendatensätze gespeichert werden, was wiederum zu einem enormen Anstieg der E/A und zur Belegung des Speichers führt.

5. Was ist ein Zeilenüberlauf?

Was also ist ein Zeilenüberlauf?

Wenn die Standarddatenseitengröße 16 KB beträgt, in Bytes umgerechnet: 16*1024 = 16384 Bytes

Ist Ihnen aufgefallen, dass die 16384 Bytes, die eine einzelne Seite speichern kann, ein Vielfaches der maximalen 65535 Bytes sind, die eine einzelne Zeile speichern kann?

Mit anderen Worten: Wenn die Datenzeile, die Sie speichern möchten, größer als 65532 Bytes ist, können Sie sie nicht schreiben. Wenn die einzelne Datenzeile, die Sie speichern möchten, kleiner als 65.535 Byte, aber größer als 16.384 Byte ist, können Sie sie erfolgreich einfügen, aber eine Datenseite kann die von Ihnen eingefügten Daten nicht speichern. An dieser Stelle kommt es definitiv zum Überlauf!

Tatsächlich tritt in den MySQL-Einstellungen nur dann kein Zeilenüberlauf auf, wenn die Größe 16384 Bytes erreicht.

Für Zeilen vom Typ varchar, Text usw. Wenn die Länge eines solchen Spaltenspeichers mehrere Hundert Bytes erreicht, kommt es zu einem Zeilenüberlauf.

6. Wie kommt es zu einem Zeilenüberlauf?

Oder schauen Sie sich dieses Bild an:

Wenn in den MySQL-Einstellungen die Länge einer Varchar-Spalte 768 Bytes erreicht, werden die ersten 768 Bytes der Spalte als Präfix in der Zeile gespeichert und die überschüssigen Daten werden auf der Überlaufseite gespeichert. Anschließend werden die beiden über einen Offsetzeiger verknüpft. Dies ist der Zeilenüberlaufmechanismus.

7. Überlegen Sie sich eine Frage

Ich frage mich, ob Sie jemals über diese Frage nachgedacht haben:

Zunächst müssen Sie wissen, dass MySQL den gruppierten Index von B+Tree verwendet. In diesem B+Tree speichern Nicht-Blattknoten nur Indizes, aber keine Daten, während Blattknoten echte Daten speichern. Gleichzeitig verweisen die Blattknoten auf die Datenseiten.

Wenn also eine einzelne Zeile nicht gespeichert werden kann, warum speichern Sie sie dann nicht auf zwei Datenseiten? Genau wie auf dem Bild unten.

Bei der Einzelknotenspeicherung werde ich mehrere Knoten verwenden, um die Zentrale zu speichern! Vielleicht wird mein B+Tee größer und höher (das ist eigentlich eine falsche Vorstellung)

Die zu dieser Fehlerbeschreibung gehörende Gehirnkarte sieht wie folgt aus:

Die Gründe, warum MySQL dies nicht tut, sind folgende:

Wenn MySQL mehr Datenzeilen auf einer Datenseite speichern möchte, muss es mindestens zwei Datenzeilen speichern. Andernfalls geht die Bedeutung von B+Tree verloren. B+Tree verkommt außerdem zu einer ineffizienten verknüpften Liste.

Sie können diesen blauen Satz schätzen. Was er mit „jede Datenseite muss mindestens zwei Datenzeilen speichern“ meinte, ist nicht, dass eine Datenseite nicht nur eine Zeile speichern kann. Sie können buchstäblich nur eine Datenzeile hineinschreiben und dann essen gehen oder etwas anderes tun. Auf dieser Datenseite gibt es immer nur eine Datenzeile.

Dies bedeutet, dass beim Schreiben einer Datenzeile auf diese Datenseite ein Überlauf durch den Zeilenüberlaufmechanismus erfolgt, selbst wenn die Datenzeile sehr groß ist und die Grenze der Datenseite erreicht. Es kann weiterhin sichergestellt werden, dass Ihr nächstes Datenelement auf diese Datenseite geschrieben werden kann.

Die richtige Mindmap sieht wie folgt aus:

siehe:

https://dev.mysql.com/doc/refman/5.7/en/innodb-row-format.html

https://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html

Autor: Gib mir Tagträume

Quelle: https://www.cnblogs.com/ZhuChangwu/p/14035330.html

Oben finden Sie eine ausführliche Erläuterung der MySQL-Datenzeilen und des Zeilenüberlaufmechanismus. Weitere Informationen zu MySQL-Datenzeilen und Zeilenüberlauf finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • So verwenden Sie PHP mysql_fetch_row zum Abfragen und Abrufen einer Liste von Datenzeilen
  • 5 MySQL-GUI-Tools, die Ihnen bei der Datenbankverwaltung empfohlen werden
  • Eine kurze Einführung in das Kommandozeilentool mycli zum Bedienen von MySQL-Datenbanken
  • Warum sollte die Anzahl der Zeilen in einer einzelnen MySQL-Tabelle 5 Millionen nicht überschreiten?
  • PHP verwendet mysqli- und pdo-Erweiterungen, um die Ausführungseffizienz von MySQL-Datenbanken zu testen und zu vergleichen. Vollständiges Beispiel
  • Führt MySQL die Aktualisierungsanweisung erneut aus, wenn sie dieselben Daten enthält wie die ursprüngliche?
  • IDEA verwendet eine Eigenschaftenkonfigurationsdatei, um eine Verbindung zur MySQL-Datenbank herzustellen
  • So verwenden Sie Binlog zur Datenwiederherstellung in MySQL
  • Detaillierte Erläuterung der geplanten Ausführungsaufgaben für MySQL-Datenbankereignisse
  • Lösen Sie das chinesische verstümmelte Problem der MySQL5.5-Datenbank-Befehlszeile unter Windows 10
  • Java verbindet, fragt ab und ändert MySQL-Datenbank

<<:  So implementieren Sie Docker, um Parameter dynamisch an Springboot-Projekte zu übergeben

>>:  Vier Möglichkeiten zum Ändern des Standard-CSS-Stils von Element-UI-Komponenten in Vue

Artikel empfehlen

CSS-Schreibstandards und -Reihenfolge teilen [für alle empfohlen]

CSS-Schreibreihenfolge 1. Positionsattribute (Pos...

So stellen Sie einen Code-Server mit Docker bereit

Ziehen Sie das Bild # Docker-Pull Codercom/Code-S...

Detaillierte Erklärung zum MySQL-Index

Inhaltsverzeichnis 1. Index-Grundlagen 1.1 Einlei...

Lösung zum automatischen Neustart von MySQL

Vorwort Kürzlich trat in der Testumgebung ein Pro...

Nicht alle Pop-ups sind betrügerisch. Tipps zum Entwerfen von Website-Pop-ups

Popup-Nachrichten sind bei inländischen Internetd...

W3C Tutorial (15): W3C SMIL Aktivitäten

SMIL fügt Unterstützung für Timing und Mediensync...

Vue Element-ui-Tabelle realisiert Baumstrukturtabelle

In diesem Artikel wird der spezifische Code der E...

Teilen Sie 8 CSS-Tools zur Verbesserung des Webdesigns

Wenn das Website-Design bearbeitet oder geändert ...

Optimierung der Web-Frontend-Leistung

Best Practices für die Web-Frontend-Optimierung: ...

So erhalten Sie den tatsächlichen Pfad des aktuellen Skripts in Linux

1. Holen Sie sich den tatsächlichen Pfad des aktu...