L'index de champ de type varchar Mysql5.7 a échoué de manière inattendue

Dans le fonctionnement et la maintenance quotidiens de la base de données Mysql, il est très courant de créer des index sur des tables, mais je n'ai jamais pensé à la durée d'un index à une seule colonne. Si le champ de type varchar est trop long, ne parviendra-t-il pas à créer un index à une seule colonne? Explorons-le ensemble.

Vérifiez les documents officiels et constatez que le paramètre innodb_large_prefix a été introduit après MySQL 5.6. Lorsqu'il est activé, le format d'enregistrement de ligne de la table Innodb est Dynamique ou Compressé, et la longueur d'un index à une seule colonne peut atteindre 3072 octets. Si elle n'est pas activé Avec ce paramètre, la longueur d'un index à une seule colonne ne peut pas dépasser 767 octets.


Introduction à l'environnement de

test L' environnement de test est la version MySQL 5.7 et le jeu de caractères par défaut est utf8.

Afficher les paramètres innodb_large_prefix

innodb_large_prefix参数在mysql5.7版本,默认是开启的。mysql> show variables like 'innodb_large%';
+---------------------+-------+
| Variable_name       | Value |
+---------------------+-------+
| innodb_large_prefix | ON    |
+---------------------+-------+
1 row in set (0.02 sec)

Afficher le format d'enregistrement par défaut de la table de test
Dans la version mysql5.7, le format d'enregistrement de ligne de la table Innodb est Dynamique.


mysql> show variables like 'innodb_default_row_format';
+---------------------------+---------+
| Variable_name             | Value   |
+---------------------------+---------+
| innodb_default_row_format | dynamic |
+---------------------------+---------+
1 row in set (0.01 sec)

Simuler le test
créer une table de test et un index

mysql> create table t_test2 (id int not null,name varchar(1024) not null default '',primary key(id));
Query OK, 0 rows affected (0.02 sec)

mysql> alter table t_test2 add index idx_t_test2_name(name);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> create table t_test3 (id int not null,name varchar(1025) not null default '',primary key(id));
Query OK, 0 rows affected (0.03 sec)

mysql> alter table t_test3 add index idx_t_test3_name(name);
ERROR 1071 (42000): Specified key was too long; max key length is 3072

octets peuvent être vus à partir des résultats du test, lorsque la longueur du champ de varchar dépasse 1024, une erreur sera signalée lors de la création d'un index à une seule colonne. Pourquoi? Comme le jeu de caractères de la base de données est utf8, une longueur de caractère occupe 3 octets, alors la longueur d'un index à une seule colonne Elle est de 3072, convertie en caractères 3072/3 = 1024, donc lorsque la table est construite, si la longueur du champ dépasse 1024, la création d'index échouera.
Désactivez le test du paramètre innodb_large_prefix

Désactivez le paramètre innodb_large_prefix


mysql> set global innodb_large_prefix=off;
Query OK, 0 rows affected, 1 warning (0.11 sec)

mysql> show variables like 'innodb_large_prefix';
+---------------------+-------+
| Variable_name       | Value |
+---------------------+-------+
| innodb_large_prefix | OFF   |
+---------------------+-------+
1 row in set (0.00 sec)

mysql> create table t_test4 (id int not null,name varchar(255) not null default '',primary key(id));
Query OK, 0 rows affected (0.02 sec)

mysql> alter table t_test4 add index idx_t_test4_name(name);
Query OK, 0 rows affected (0.35 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> create table t_test5 (id int not null,name varchar(256) not null default '',primary key(id));
Query OK, 0 rows affected (0.01 sec)

mysql> alter table t_test5 add index idx_t_test5_name(name);
ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes

On peut voir qu'à ce moment, si la longueur du champ dépasse 255, une erreur sera signalée lors de la création d'un index à une seule colonne.

Mais en production, qui créerait un index sur une colonne d'une longueur supérieure à 1024? N'est-ce pas malade, il est donc recommandé de désactiver le paramètre innodb_large_prefix pour éviter de créer des index sur des champs longs.

Je suppose que tu aimes

Origine blog.51cto.com/15061930/2642100
conseillé
Classement