So berechnen Sie den Wert von ken_len im MySQL-Abfrageplan

So berechnen Sie den Wert von ken_len im MySQL-Abfrageplan

Die Bedeutung von key_len

In MySQL können Sie „explain“ verwenden, um den von der SQL-Anweisung genommenen Pfad anzuzeigen, wie unten gezeigt:

mysql> Tabelle erstellen t (a int Primärschlüssel, b int nicht null, c int nicht null, Index(b));
 Abfrage OK, 0 Zeilen betroffen (0,01 Sek.)
 mysql> erkläre „select b from t“;
 +----+-----------+----------+-----------+---------------+------+---------+---------+------+---------+-------------+
 | ID | Auswahltyp | Tabelle | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | Extra |
 +----+-----------+----------+-----------+---------------+------+---------+---------+------+---------+-------------+
 | 1 | SIMPLE | t | index | NULL | b | 4 | NULL | 1 | Index verwenden |
 +----+-----------+----------+-----------+---------------+------+---------+---------+------+---------+-------------+
 1 Zeile im Satz (0,00 Sek.)

Unter diesen stellt key_len die verwendete Indexlänge in Bytes dar. Da im obigen Beispiel der int-Typ 4 Bytes belegt und der Index nur eine Spalte enthält, ist key_len 4.

So sieht ein gemeinsamer Index aus:

mysql> Tabelle ändern t Index hinzufügen ix(b, c);
Abfrage OK, 0 Zeilen betroffen (0,03 Sek.)
Datensätze: 0 Duplikate: 0 Warnungen: 0
mysql> erkläre select b, c from t;
+----+-----------+-------+-----------+---------------+------+---------+---------+------+---------+-------------+
| ID | Auswahltyp | Tabelle | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | Extra |
+----+-----------+-------+-----------+---------------+------+---------+---------+------+---------+-------------+
| 1 | SIMPLE | t | index | NULL | ix | 8 | NULL | 1 | Index verwenden |
+----+-----------+-------+-----------+---------------+------+---------+---------+------+---------+-------------+
1 Zeile im Satz (0,00 Sek.)

Der gemeinsame Index ix enthält zwei Spalten und beide werden verwendet, daher ist ken_len 8.

An diesem Punkt können wir die Bedeutung von key_len bereits verstehen, und es scheint, dass es nichts mehr zu sagen gibt. Bei der Berechnung von key_len in MySQL gibt es jedoch noch viele Dinge zu beachten.

Wenn wir beispielsweise die NOT NULL-Einschränkung der Spalte b entfernen, weicht ken_len von unseren Erwartungen ab, wie unten gezeigt:

mysql> Tabelle ändern t b int ändern;
Abfrage OK, 0 Zeilen betroffen (0,01 Sek.)
Datensätze: 0 Duplikate: 0 Warnungen: 0
 
mysql> erkläre „select b from t“;
+----+-----------+-------+-----------+---------------+------+---------+---------+------+---------+-------------+
| ID | Auswahltyp | Tabelle | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | Extra |
+----+-----------+-------+-----------+---------------+------+---------+---------+------+---------+-------------+
| 1 | SIMPLE | t | index | NULL | b | 5 | NULL | 1 | Index verwenden |
+----+-----------+-------+-----------+---------------+------+---------+---------+------+---------+-------------+
1 Zeile im Satz (0,00 Sek.)

Berechnungsregeln für key_len in MySQL

In MySQL lauten die Berechnungsregeln für key_len wie folgt:

  • Wenn die Spalte leer sein kann, addieren Sie 1 zu den vom Datentyp belegten Bytes. Wenn der int-Typ beispielsweise nicht leer sein kann, ist key_len 4, und wenn er leer sein kann, ist key_len 5.
  • Wenn die Spalte eine variable Länge hat, addieren Sie 2 zur Basisanzahl der von der Datenspalte belegten Bytes. Wenn varbinary(10) beispielsweise nicht leer sein kann, ist key_len gleich 10 + 2. Wenn es leer sein kann, ist key_len gleich 10+2+1.
  • Wenn es sich um einen Zeichentyp handelt, müssen Sie auch den Zeichensatz berücksichtigen. Wenn beispielsweise eine Spalte als varchar(10) definiert ist und utf8 ist und nicht leer sein kann, dann ist key_len 10 * 3 + 2. Wenn sie leer sein kann, dann ist key_len 10*3+2+1.
  • Darüber hinaus ist die Berechnungsmethode der Dezimalspalte dieselbe wie oben. Wenn sie leer sein kann, addieren Sie 1 zu den vom Datentyp belegten Bytes. Die Berechnung der Anzahl der von der Dezimalstelle selbst belegten Bytes ist jedoch komplizierter.

Laut offiziellen Dokumenten wird Dezimal als Dezimalzahl(M,D) definiert, wobei M die Gesamtzahl der Ziffern und D die Anzahl der Ziffern nach dem Dezimalpunkt ist. Die Ziffern vor und nach dem Dezimalpunkt werden separat gespeichert, und 9 Ziffern werden zu einer zusammengefasst, wobei 4 Bytes zum Speichern verwendet werden. Wenn die Zahl weniger als 9 Ziffern hat, ist die Anzahl der erforderlichen Bytes wie folgt:

Reststellen Anzahl Bytes
-----------------------------
|0 |0 |
|1-2 |1 |
|3-4 |2 |
|5-6 |3 |
|7-9 |4 |
-----------------------------

Zum Beispiel:

decimal(20,6) => 14 Ziffern links vom Dezimalpunkt, 6 Ziffern rechts vom Dezimalpunkt => Die Ziffern links vom Dezimalpunkt werden in 5 + 9 gruppiert, was 3 Bytes + 4 Bytes zum Speichern erfordert, und der Dezimalpunkt wird in 3 Bytes zum Speichern gruppiert => Insgesamt werden 10 Bytes benötigt
decimal(18,9) => 9 Ziffern links vom Dezimalpunkt, 9 Ziffern rechts vom Dezimalpunkt => jeweils 4 Bytes werden zum Speichern benötigt => insgesamt 8 Bytes
decimal(18,2) => 16 Ziffern links vom Dezimalpunkt, 2 Ziffern rechts vom Dezimalpunkt => gruppiert als 7 + 9, 8 Bytes zum Speichern erforderlich, 1 Byte rechts vom Dezimalpunkt => insgesamt 9 Bytes erforderlich

Gemeinsame Indizes anhand von key_len analysieren

Wie unten gezeigt definieren wir eine Tabelle t, die 4 Spalten enthält: a, b, c und d:

mysql> zeigen erstellen Tabelle t\G
*************************** 1. Reihe ***************************
    Tabelle: t
Tabelle erstellen: CREATE TABLE `t` (
 `a` int(11) NICHT NULL,
 `b` int(11) DEFAULT NULL,
 `c` int(11) DEFAULT NULL,
 `d` int(11) DEFAULT NULL,
 Primärschlüssel (`a`),
 SCHLÜSSEL `ix_x` (`b`,`d`,`c`)
) ENGINE=InnoDB STANDARD-CHARSET=utf8
1 Zeile im Satz (0,00 Sek.)

Die nun auszuführende SQL-Anweisung lautet:

Wähle a aus t, wobei b = 5 und d = 10, sortiere nach c;

Angenommen, wir haben einen Index ix_x(b,d,c) und erhalten durch Explain die folgende Ausgabe:

mysql> erklären Sie „Wählen Sie a aus t, wobei b = 5 und d = 10, sortieren Sie nach c;“
+----+-----------+------+-----------+---------------+------+---------+---------+----------+---------+---------+--------------------------+
| ID | Auswahltyp | Tabelle | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | Extra |
+----+-----------+------+-----------+---------------+------+---------+---------+----------+---------+---------+--------------------------+
| 1 | SIMPLE | t | ref | ix_x | ix_x | 10 | const,const | 1 | Mit where; Mit index |
+----+-----------+------+-----------+---------------+------+---------+---------+----------+---------+---------+--------------------------+
1 Zeile im Satz (0,00 Sek.)

Wie Sie sehen, verwendet die Abfrageanweisung die Spalten b und d im gemeinsamen Index, um die Daten zu filtern.

Wenn der von uns definierte gemeinsame Index nicht „ix_x(b, d, c)“, sondern „ix_x(b, c, d)“ ist, lautet die durch „explain“ erhaltene Eingabe wie folgt:

mysql> Tabelle ändern t Index ix_x löschen;
mysql> Tabelle ändern t Index ix_x(b, c, d) hinzufügen;
mysql> erklären Sie „Wählen Sie a aus t, wobei b = 5 und d = 10, sortieren Sie nach c;“
+----+--------------+-------+---------+---------------+------+------+------+------+------+------+---------+--------------------------+
| ID | Auswahltyp | Tabelle | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | Extra |
+----+--------------+-------+---------+---------------+------+------+------+------+------+------+---------+--------------------------+
| 1 | SIMPLE | t | ref | ix_x | ix_x | 5 | const | 2 | Where verwenden; Index verwenden |
+----+--------------+-------+---------+---------------+------+------+------+------+------+------+---------+--------------------------+
1 Zeile im Satz (0,00 Sek.)

key_len ist 5, das heißt, nur die erste Spalte im gemeinsamen Index wird verwendet. Es ist ersichtlich, dass der gemeinsame Index zwar alle Spalten enthält, die wir abfragen möchten, die SQL-Anweisung den Index jedoch aufgrund der Definitionsreihenfolge nicht vollständig nutzen kann.

Das könnte Sie auch interessieren:
  • MySQL-Funktion zur Berechnung der Zeitdifferenz
  • Mehrere Möglichkeiten zum Berechnen des Alters anhand des Geburtstags in MySQL
  • Methode zum Berechnen der Zeitdifferenz in PHP und MySQL
  • Implementierungscode für die Berechnung der MySQL-Zeichenfolgenlänge (gb2312+utf8)
  • Bedeutung und Berechnungsmethode von QPS und TPS der MySQL-Datenbank
  • Zusammenfassung mehrerer wichtiger Methoden zur Berechnung und Optimierung des Leistungsindex für MySQL
  • Eine kurze Diskussion über die Berechnungsmethode von key_len in MySQL erklären
  • Beispielanalyse der Intervallberechnung von MySQL-Datum und -Uhrzeit
  • Detaillierte Erklärung der MySQL-Datumsadditions- und -subtraktionsfunktionen
  • Beispiele für die Erstellung und Verwendung von MySQL-Triggern
  • Detaillierte Erklärung der grundlegenden Verwendung von MySQL-Triggern [Erstellen, Anzeigen, Löschen usw.]
  • Detaillierte Erläuterung der Implementierungsmethode für kumulative Berechnungen von MySQL

<<:  Kennen Sie die seltsamen Dinge in Javascript?

>>:  So deinstallieren Sie Docker Toolbox vollständig

Artikel empfehlen

JavaScript realisiert den Warteschlangenstrukturprozess

Inhaltsverzeichnis 1. Warteschlangen verstehen 2....

Der Unterschied zwischen ID- und Name-Attributen von HTML-Elementen

Heute bin ich etwas verwirrt über <a href="...

So verarbeiten Sie Blob-Daten in MySQL

Der spezifische Code lautet wie folgt: Paket epoi...

Detaillierte Erklärung zur Verwendung von Vue zum Laden von Wetterkomponenten

In diesem Artikel erfahren Sie, wie Sie mit Vue W...

JS verwendet Canvas-Technologie, um Echarts-Balkendiagramme zu imitieren

Canvas ist ein neues Tag in HTML5. Sie können js ...

Drei Möglichkeiten zur Kommunikation zwischen Docker-Containern

Wir alle wissen, dass Docker-Container voneinande...

Das Docker-Maven-Plugin-Plugin kann das entsprechende JAR-Paket nicht abrufen

Bei Verwendung des Plug-Ins „Docker-Maven-Plugin“...

Mysql Workbench - Abfragemethode für MySQL-Datenbanken

Mysql Workbench ist ein Open-Source-Datenbankclie...

So erstellen Sie Gitlab auf CentOS6

Vorwort Das ursprüngliche Projekt wurde im öffent...

So installieren Sie mehrere mysql5.7.19 (tar.gz)-Dateien unter Linux

Informationen zur ersten Installation der MySQL-5...

Erste Schritte mit Nginx Reverse Proxy

Inhaltsverzeichnis Überblick Die Rolle des Revers...