Dieser Artikel vermittelt Ihnen relevantes Wissen über MySQL, das hauptsächlich Probleme im Zusammenhang mit dem InnoDB-Zeilenformat aus binären Inhalten behandelt. InnoDB ist eine Speicher-Engine, die Daten in Tabellen auf der Festplatte speichert, sodass unsere Daten auch nach dem Herunterfahren und Neustarten erhalten bleiben Ich hoffe, es wird für alle hilfreich sein.
Empfohlenes Lernen: MySQL-Video-Tutorial
InnoDB ist eine Speicher-Engine, die Daten in Tabellen auf der Festplatte speichert, sodass unsere Daten auch nach dem Herunterfahren und Neustarten noch vorhanden sind. Der eigentliche Prozess der Datenverarbeitung findet im Speicher statt, daher müssen die Daten auf der Festplatte in den Speicher geladen werden. Wenn eine Schreib- oder Änderungsanforderung verarbeitet wird, muss auch der Inhalt im Speicher auf der Festplatte aktualisiert werden. Und wir wissen, dass die Geschwindigkeit beim Lesen und Schreiben auf die Festplatte sehr langsam ist, was sich um mehrere Größenordnungen vom Lesen und Schreiben im Speicher unterscheidet. Wenn wir also bestimmte Datensätze aus der Tabelle abrufen möchten, muss die InnoDB-Speicher-Engine lesen die Datensätze einzeln von der Festplatte löschen?
Die von InnoDB verwendete Methode besteht darin, die Daten in mehrere Seiten aufzuteilen und Seiten als grundlegende Interaktionseinheit zwischen Festplatte und Speicher zu verwenden. Die Größe einer Seite in InnoDB beträgt im Allgemeinen 16 KB. Das heißt, unter normalen Umständen werden jeweils mindestens 16 KB Inhalt von der Festplatte in den Speicher gelesen und jeweils mindestens 16 KB des Speicherinhalts auf der Festplatte aktualisiert.
mysql> show variables like '%innodb_page_size%'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | innodb_page_size | 16384 | +------------------+-------+ 1 row in set (0.00 sec)
Wir fügen Daten normalerweise in Datensatzeinheiten in die Tabelle ein. Die Art und Weise, wie diese Datensätze auf der Festplatte gespeichert werden, wird auch Zeilenformat oder Datensatzformat genannt. Die InnoDB-Speicher-Engine hat vier verschiedene Arten von Zeilenformaten entwickelt, nämlich kompakte, redundante, dynamische und komprimierte Zeilenformate.
Da es in frühen InnoDB-Versionen nur ein Dateiformat gab, war es nicht erforderlich, dieses Dateiformat zu benennen. Während sich die InnoDB-Engine weiterentwickelt, werden neue Dateiformate entwickelt, die mit früheren Versionen nicht kompatibel sind, um neue Funktionen zu unterstützen. Um die Systemkompatibilität in Upgrade- und Downgrade-Situationen sowie bei der Ausführung verschiedener MySQL-Versionen zu verwalten, begann InnoDB mit der Verwendung eines benannten Dateiformats.
In msyql 5.7.9 und späteren Versionen wird das Standardzeilenformat durch die Variable innodb_default_row_format bestimmt und ihr Standardwert ist dynamisch:
mysql> show variables like "innodb_file_format"; +--------------------+-----------+ | Variable_name | Value | +--------------------+-----------+ | innodb_file_format | Barracuda | +--------------------+-----------+ 1 row in set (0.01 sec) mysql> show variables like "innodb_default_row_format"; +---------------------------+---------+ | Variable_name | Value | +---------------------------+---------+ | innodb_default_row_format | dynamic | +---------------------------+---------+ 1 row in set (0.00 sec)
Zeigen Sie das von der aktuellen Tabelle verwendete Zeilenformat an:
mysql> show table status like 'dept_emp'\G*************************** 1. row *************************** Name: dept_emp Engine: InnoDB Version: 10 Row_format: Dynamic Rows: 331570 Avg_row_length: 36 Data_length: 12075008Max_data_length: 0 Index_length: 5783552 Data_free: 0 Auto_increment: NULL Create_time: 2021-08-11 09:04:36 Update_time: NULL Check_time: NULL Collation: latin1_swedish_ci Checksum: NULL Create_options: Comment:1 row in set (0.00 sec)
Geben Sie an Zeilenformat der Tabelle:
CREATE TABLE 表名(列的信息) ROW_FORMAT=行格式名称ALTER TABLE 表名 ROW_FORMAT=行格式名称;
Wenn Sie den Zeilenmodus einer vorhandenen Tabelle auf komprimiert oder dynamisch ändern möchten, müssen Sie zuerst das Dateiformat auf Barracuda einstellen: set global innodb_file_format=Barracuda;, und verwenden Sie dann ALTER TABLE Tabellenname ROW_FORMAT=COMPRESSED; um die Änderung wirksam zu machen.
MySQL unterstützt einige Datentypen mit variabler Länge, wie z. B. VARCHAR(M), VARBINARY(M), verschiedene TEXT-Typen, verschiedene BLOB-Typen und wir Spalten mit Diese Datentypen können auch als Felder mit variabler Länge bezeichnet werden. Die Anzahl der in einem Feld mit variabler Länge gespeicherten Datenbytes ist nicht festgelegt. Wenn wir also echte Daten speichern, müssen wir auch die Anzahl der von diesen Daten belegten Bytes speichern. aufstehen. Wenn die maximal zulässige Anzahl von Bytes, die im Variablenfeld gespeichert werden dürfen (M × W), 255 Bytes überschreitet und die tatsächliche Anzahl der gespeicherten Bytes (L) 127 Bytes überschreitet, verwenden Sie 2 Bytes zum Aufzeichnen, andernfalls verwenden Sie 1 Bytes zum Aufzeichnen.
Frage 1: Warum also 128 als Trennlinie verwenden? Ein Byte kann bis zu 255 darstellen. Als MySQL jedoch die Längendarstellung entwarf, wurde festgelegt, dass zwei Bytes die Länge darstellen, wenn das höchste Bit 1 ist, um zu unterscheiden, ob es sich um ein Byte handelt, das die Länge darstellt ist ein Byte. Zum Beispiel 01111111 bedeutet dies, dass die Länge 127 beträgt. Wenn die Länge 128 beträgt, werden zwei Bytes benötigt, also 10000000 10000000. Das höchste Bit des ersten Bytes ist 1, dann ist dies der Anfang der beiden Bytes, die das darstellen Das zweite Byte kann alle Bits zur Darstellung der Länge verwenden, und es ist zu beachten, dass MySQL die Little-Endian-Zählmethode verwendet, wobei das niedrige Bit zuerst und das hohe Bit zuletzt verwendet wird, sodass 129 10000001 10000000 ist. Gleichzeitig beträgt die maximale Länge dieser Identifikationsmethode 2^15-1=32767, was 32 KB entspricht.
Frage 2: Was sollen wir tun, wenn zwei Bytes nicht ausreichen, um die Länge darzustellen? Die Standardseitengröße von innoDB beträgt 16 KB. Bei einigen Feldern, die eine sehr große Anzahl von Bytes belegen, ist die Länge eines Felds beispielsweise größer als 16 KB. Wenn der Datensatz nicht auf einer einzelnen Seite gespeichert werden kann, speichert InnoDB einen Teil davon Bei den Daten im sogenannten Überlauf wird nur die auf dieser Seite verbleibende Länge in der Längenliste des Felds mit variabler Länge gespeichert, sodass sie mit zwei Bytes gespeichert werden kann. Dieser Überlaufseitenmechanismus bezieht sich später auf den Datenüberlauf.
Einige Spalten in der Tabelle können NULL-Werte speichern, wenn diese NULL-Werte in den realen Daten des Datensatzes gespeichert werden. Daher werden diese Spalten vom Compact-Zeilenformat verwaltet mit NULL-Werten auf einheitliche Weise, gespeichert in einer Liste von NULL-Werten. Jede Spalte, die NULL speichern darf, entspricht einem Binärbit. Wenn der Wert des Binärbits 1 ist, bedeutet dies, dass der Wert der Spalte NULL ist. Wenn der binäre Bitwert 0 ist, bedeutet dies, dass der Wert der Spalte nicht NULL ist.
Die Datensatz-Header-Informationen, die zur Beschreibung des Datensatzes verwendet werden und aus festen 5 Bytes bestehen. 5 Bytes sind 40 Binärbits, und verschiedene Bits haben unterschiedliche Bedeutungen.
Feld | Länge (Bit) | Beschreibung |
---|---|---|
Reserviertes Bit 1 | 1 | Nicht verwendet |
Reserviertes Bit 2 | 1 | Nicht verwendet |
delete_mask | 1 | markiert, ob der Datensatz gelöscht wurde. |
min_rec_mask. | 1 | bedeutet die Anzahl der Datensätze, die dem aktuellen Datensatz gehören.|
13 | stellt die Positionsinformationen des aktuellen Datensatzes auf der Seite dar. | |
3 | stellt den Typ des aktuellen Datensatzes dar. 0 stellt einen normalen Datensatz dar, 1 stellt einen B+-Baum-Nicht-Blattknoten-Datensatz dar, 2 stellt den minimalen Datensatz dar, 3 stellt den maximalen Datensatz dar. Next_record stellt die relative Position des nächsten Datensatzes dar |
Das obige ist der detaillierte Inhalt vonSo lesen Sie das InnoDB-Zeilenformat aus Binärinhalten in MySQL. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!