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
Inhaltsverzeichnis 1. Warteschlangen verstehen 2....
Heute bin ich etwas verwirrt über <a href="...
Der spezifische Code lautet wie folgt: Paket epoi...
In diesem Artikel erfahren Sie, wie Sie mit Vue W...
1. Aufgetretene Probleme Bei der verteilten Proje...
Inhaltsverzeichnis 1. Implementieren Sie die Komp...
dig - Dienstprogramm zur DNS-Suche Wenn beim Zugr...
Canvas ist ein neues Tag in HTML5. Sie können js ...
Wir alle wissen, dass Docker-Container voneinande...
Dieser Artikel veranschaulicht anhand von Beispie...
Bei Verwendung des Plug-Ins „Docker-Maven-Plugin“...
Mysql Workbench ist ein Open-Source-Datenbankclie...
Vorwort Das ursprüngliche Projekt wurde im öffent...
Informationen zur ersten Installation der MySQL-5...
Inhaltsverzeichnis Überblick Die Rolle des Revers...