Maison  >  Article  >  base de données  >  Quelle est la signification de key_len dans MySQL, expliquez et comment le calculer

Quelle est la signification de key_len dans MySQL, expliquez et comment le calculer

王林
王林avant
2023-06-02 09:52:132552parcourir

Avant-propos

Dans le résultat de l'exécution d'explication dans Mysql, une colonne contient key_len, alors quelle est la signification de key_len ?

key_len : indique le nombre d'octets utilisés par l'index. Sur la base de cette valeur, l'utilisation de l'index peut être jugée. Surtout lors de la combinaison d'index, il est très important de juger combien de parties de l'index sont utilisées.

Remarques sur le calcul de key_len :

  • Informations supplémentaires sur les champs d'index : peuvent être divisés en types de données de longueur variable et de longueur fixe pour discussion Lorsque le champ d'index est un type de données de longueur fixe, tel que char. , int, datetime, vous devez avoir Qu'il s'agisse d'une balise nulle, cette balise occupe 1 octet (pour un champ qui n'est pas nul, ce 1 octet n'est pas nécessaire pour les types de données de longueur variable, tels que varchar, dans) ; En plus d'une balise nulle, il a également besoin d'informations de longueur, qui occupent deux octets.

  • Pour les jeux de caractères tels que char, varchar, blob, text, etc., la longueur de la clé len est également liée au jeu de caractères. Un caractère de latin1 occupe 1 octet, un caractère de gbk occupe 2 octets et. un caractère de utf8 occupe 3 octets.

Exemple :

Type de colonne KEY_LEN Remarks
id int key_len = 4+1 int est de 4 octets, NULL est autorisé , ajoutez 1 octet
id bigint not null key_len=8 bigint fait 8 octets
user char(30) utf8 key_len=30*3+1 utf8 chaque caractère fait 3 octets, NULL est autorisé, ajoutez 1 octet
user varchar(30) non nul utf8 key_len=30*3+2 utf8 Chaque caractère fait 3 octets, type de données de longueur variable, ajoutez 2 octets
user varchar(30) utf8 key_len=30* 3 +2+1 utf8 chaque caractère fait 3 octets, NULL est autorisé, ajoutez 1 octet, type de données de longueur variable, ajoutez 2 octets
texte détaillé (10) utf8 key_len=30*3+2+1 Le la partie interceptée de TEXT est considérée comme un type de colonne dynamique.

Remarque : key_len indique uniquement la colonne d'index sélectionnée lorsqu'elle est utilisée pour le filtrage conditionnel dans Where, et n'inclut pas la colonne d'index sélectionnée dans l'ordre par/groupe par partie.

Par exemple, il existe un index commun idx (c1, c2, c3), et les trois colonnes sont toutes int non nulles, alors dans le plan d'exécution SQL suivant, la valeur de key_len est 8 au lieu de 12 :

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

Exemple

Ci-dessous Illustrons avec un exemple spécifique. Structure du tableau :

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;

Le résultat de l'exécution d'explication est le suivant :

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 |
+----+-------------+-------+-------+---------------+--------+---------+------+------+-------------+

Vous pouvez voir que les résultats de a=0&b>0 et a>0&b=0 expliquent. sont "presque" les mêmes, et les deux utilisent l'index index1 , sont tous les résultats obtenus à partir de l'index de plage (c'est-à-dire en parcourant l'intervalle d'index). La seule différence est key_len. En fonction de la longueur de l'index key_len, vous pouvez déduire le nombre de dimensions utilisées par l'index multidimensionnel. (Les index MySQL sont tous des index préfixes)

index1 est un index bidimensionnel KEY index1 (a,b), donc la longueur doit être 4+4.

a=0&b>0 key_len vaut 8, ce qui signifie que le résultat peut être obtenu en utilisant uniquement l'index. Utilisez d'abord a=0 pour trouver le nœud de l'arbre, puis filtrez-le en fonction de b>0 en dessous pour obtenir le nœud. résultat. C'est-à-dire que les résultats peuvent être obtenus « complètement » à l'aide de l'index.

a>0&b=0 key_len vaut 4, ce qui signifie que seule la première dimension de l'index de préfixe est utilisée pour obtenir le résultat (clé primaire), puis la ligne entière est lue dans la clé primaire. index clé (index clusterisé). Selon b = 0 pour filtrer les données pertinentes et obtenir les résultats. Autrement dit, "incomplet" utilise l'index pour obtenir le résultat.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer