El índice de campo de tipo varchar mysql5.7 falló inesperadamente

En la operación y mantenimiento diarios de la base de datos Mysql, es muy común crear índices en tablas, pero nunca he pensado en cuánto tiempo puede ser un índice de una sola columna. Si el campo de tipo varchar es demasiado largo, ¿no podrá crear un índice de una sola columna? Exploremos juntos.

Verifique los documentos oficiales y descubrió que el parámetro innodb_large_prefix se introdujo después de MySQL 5.6. Cuando está habilitado, el formato de registro de fila de la tabla Innodb es Dinámico o Comprimido, y la longitud de un índice de una sola columna puede alcanzar los 3072 bytes. no está habilitado Con este parámetro, la longitud de un índice de una sola columna no puede exceder los 767 bytes de longitud.


Introducción al entorno de

prueba El entorno de prueba es la versión MySQL 5.7 y el juego de caracteres predeterminado es utf8.

Ver parámetros 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)

Ver el formato de registro predeterminado de la tabla de prueba
En la versión mysql5.7, el formato de registro de fila de la tabla Innodb es Dinámico.


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

Simular prueba
crear tabla e índice de prueba

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

bytes se pueden ver en los resultados de la prueba, cuando la longitud del campo de varchar excede 1024, se informará un error al crear un índice de una sola columna. ¿Por qué? Debido a que el juego de caracteres de la base de datos es utf8, la longitud de un carácter ocupa 3 bytes, entonces la longitud de un índice de una sola columna es 3072, convertida en caracteres 3072/3 = 1024, por lo que cuando se construye la tabla, si la longitud del campo excede 1024, la creación del índice fallará.
Desactivar la prueba del parámetro innodb_large_prefix

Desactive el parámetro 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

Se puede ver que en este momento, si la longitud del campo excede 255, se reportará un error al crear un índice de una sola columna.

Pero en producción, ¿quién crearía un índice en una columna con una longitud de más de 1024? ¿No es esto enfermizo, por lo que se recomienda desactivar el parámetro innodb_large_prefix para evitar la creación de índices en campos largos?

Supongo que te gusta

Origin blog.51cto.com/15061930/2642100
Recomendado
Clasificación