Heim  >  Artikel  >  Datenbank  >  Was bedeutet key_len in MySQL und wie man es berechnet

Was bedeutet key_len in MySQL und wie man es berechnet

王林
王林nach vorne
2023-06-02 09:52:132580Durchsuche

Vorwort

Es gibt eine Spalte von key_len im Ergebnis der Ausführung von EXPLAIN in MySQL. Was bedeutet also key_len?

key_len: Gibt die Anzahl der vom Index verwendeten Bytes an. Anhand dieses Werts kann die Verwendung des Index beurteilt werden. Insbesondere beim Kombinieren von Indizes ist es sehr wichtig zu beurteilen, wie viele Teile davon verwendet werden Index verwendet werden.

Hinweise zur Berechnung von key_len:

  • Zusätzliche Informationen für Indexfelder: kann in variable Länge und unterteilt werden Diskussion über lange Datentypen: Wenn das Indexfeld ein Datentyp mit fester Länge ist, z. B. char, int, datetime, ist eine Markierung erforderlich, um anzugeben, ob es 1 Byte belegt (für Felder, die dies nicht sind). null, dies ist nicht erforderlich. Für Datentypen variabler Länge, wie z. B. Varchar, sind zusätzlich zur Leermarke auch Längeninformationen erforderlich, die zwei Bytes belegen.

  • Bei Zeichensätzen wie char, varchar, blob, text usw. hängt die Länge des Schlüssels len auch davon ab, welchen Zeichensatz Latin1 einnimmt 1 Byte. Ein Zeichen in GBK belegt 2 Bytes und ein Zeichen in UTF8 belegt 3 Bytes.

Beispiel:

Noteid intkey_len = 4+1int ist 4 Bytes , NULL ist erlaubt, 1 Byte hinzufügenid bigint not nullkey_len=8bigint ist 8 Bytes user char(30) utf8key_len=30*3+1utf8 Jedes Zeichen ist 3 Byte groß , NULL ist erlaubt, 1 Byte hinzufügenuser varchar(30) not null utf8key_len=30*3+2#🎜🎜 # user varchar(30) utf8key_len=30*3+2+1Hinweis: key_len gibt nur die ausgewählte Indexspalte an, wenn sie für die bedingte Filterung in „Where“ verwendet wird, und beinhaltet nicht Sortieren nach/Gruppieren nach Dieser Teil ist die ausgewählte Indexspalte.
Spaltentyp KEY_LEN # 🎜🎜#
utf8 Jedes Zeichen besteht aus 3 Bytes, Datentyp variabler Länge, 2 Bytes hinzufügen
key_len =30*3+2+1 utf8 Jedes Zeichen besteht aus 3 Bytes, NULL ist zulässig, 1 Byte hinzufügen, Datentyp variabler Länge, 2 Bytes hinzufügen #🎜🎜 ## 🎜🎜#detail text(10) utf8
TEXT abgefangener Teil, der als dynamischer Spaltentyp betrachtet wird.
Zum Beispiel gibt es einen gemeinsamen Index idx (c1, c2, c3) und die drei Spalten sind alle int und nicht null, dann ist im folgenden SQL-Ausführungsplan der Wert von key_len ist 8 statt 12:

select ... from tb where c1=? and c2=? order by c1;

Beispiel

Das Folgende ist ein konkretes Beispiel zur Veranschaulichung der Tabellenstruktur:

CREATE TABLE `t4` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `a` int(11) NOT NULL DEFAULT '0',
  `b` int(11) NOT NULL DEFAULT '0',
  `c` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `index1` (`a`,`b`)
) ENGINE=InnoDB;

Das Ergebnis der Ausführung „explain“ lautet wie folgt: #🎜🎜 #
mysql> explain select * from t4 where a =0 and b > 0;
+----+-------------+-------+-------+---------------+--------+---------+------+------+-------------+
| id | select_type | table | type  | possible_keys | key    | key_len | ref  | rows | Extra       |
+----+-------------+-------+-------+---------------+--------+---------+------+------+-------------+
|  1 | SIMPLE      | t4    | range | index1        | index1 | 8       | NULL |    1 | Using where |
+----+-------------+-------+-------+---------------+--------+---------+------+------+-------------+
mysql> explain select * from t4 where a > 0 and b = 0;
+----+-------------+-------+-------+---------------+--------+---------+------+------+-------------+
| id | select_type | table | type  | possible_keys | key    | key_len | ref  | rows | Extra       |
+----+-------------+-------+-------+---------------+--------+---------+------+------+-------------+
|  1 | SIMPLE      | t4    | range | index1        | index1 | 4       | NULL |    1 | Using where |
+----+-------------+-------+-------+---------------+--------+---------+------+------+-------------+

Sie können sehen, dass die Ergebnisse von a=0&b>0 und a>0&b=0 „fast“ gleich sind. Sie verwenden beide den Index index1 und sind die Ergebnisse des Bereichsindex (d. h. Scannen des Indexintervalls). Der einzige Unterschied ist key_len. Anhand der Indexlänge key_len können Sie ableiten, wie viele Dimensionen vom mehrdimensionalen Index verwendet werden. (MySQL-Indizes sind alle Präfixindizes)

index1 ist ein zweidimensionaler Index KEY index1 (a,b), daher sollte die Länge 4+4 betragen.

a=0&b>0 key_len ist 8, was bedeutet, dass das Ergebnis nur mithilfe des Index erhalten werden kann. Verwenden Sie zunächst a=0, um den Baumknoten zu finden, und filtern Sie dann nach b> 0 darunter, um das Ergebnis zu erhalten. Das heißt, die Ergebnisse können „vollständig“ über den Index ermittelt werden.

a>0&b=0 key_len ist 4, was bedeutet, dass nur die erste Dimension des Präfixindex verwendet wird, nur a>0 wird verwendet, um das Ergebnis (Primärschlüssel) zu erhalten und dann einzulesen Der Primärschlüsselindex (Clustered-Index) Nehmen Sie die gesamte Zeile, filtern Sie die relevanten Daten basierend auf b = 0 und erhalten Sie das Ergebnis. Das heißt, „unvollständig“ verwendet den Index, um das Ergebnis zu erhalten.

Das obige ist der detaillierte Inhalt vonWas bedeutet key_len in MySQL und wie man es berechnet. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen