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:
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 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 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:
|
<<: Kennen Sie die seltsamen Dinge in Javascript?
>>: So deinstallieren Sie Docker Toolbox vollständig
<br />Dies stammt aus dem Inhalt von „Web Fr...
1. Überprüfen Sie den Synchronisierungsstatus der...
Die Linux-Befehlszeile bietet viele Befehle zum B...
Inhaltsverzeichnis 1. Routing-Konfiguration 2. Vu...
In diesem Artikel wird der spezifische JavaScript...
(1) Jedes HTML-Tag hat ein Attribut style, das CS...
Datenbankversion: mysql> select version(); +--...
1. Wer ist Tomcat? 2. Was kann Tomcat? Tomcat ist...
MySQL UNION-Operator Dieses Tutorial stellt die S...
Egal wie großartig Ihre persönliche Website ist, ...
Nach dem Einrichten des MySQL-Master-Slaves wisse...
Einführung Heute habe ich gelernt, wie man mit Py...
Beim Installieren der Datenbank ist folgender Feh...
Der Cut-Befehl in Linux und Unix dient dazu, aus ...
Dieser Artikel verwendet die Gearman+MySQL-Method...