Recuerde un problema de ejecución de declaraciones de MySQL

La estructura de la tabla es la siguiente:


mysql> CREATE TABLE `table_a` (
  `id` int(11) NOT NULL,
  `b` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `b` (`b`)
) ENGINE=InnoDB;

Suponga que ahora hay 1 millón de filas de datos en la tabla, y el valor de b de 100,000 filas de datos es '1234567890'. Suponga que la declaración de ejecución actual se escribe así:


mysql> select * from table_a where b='1234567890abcd';

En este momento, ¿cómo se ejecutará MySQL?

  • Idealmente, si MySQL ve que el campo b define varchar (10), debe devolver un valor nulo. Desafortunadamente, MySQL no hizo esto.
  • O bien, simplemente tome '1234567890abcd' en el índice para hacer la comparación. No debe poder determinar rápidamente que no existe tal valor en el árbol de índice b, y pronto se devolverá un resultado vacío. Pero, de hecho, MySQL no hace esto.

 

La ejecución de esta declaración SQL es muy lenta y el flujo es así:

  1. Cuando se pasa al motor para su ejecución, el carácter se trunca. Debido a que esta línea en el motor solo define una longitud de 10, solo se truncan los primeros 10 bytes, que es '1234567890' para buscar la coincidencia;
  2. De esta forma, hay 100.000 filas de datos que cumplen las condiciones;
  3. Debido a que está seleccionado *, tiene que volver a la tabla 100.000 veces;
  4. Pero cada vez que vuelvo a la tabla y encuentro la fila completa, voy a la capa del servidor para juzgar, el valor de b no es '1234567890abcd';
  5. El resultado devuelto está vacío.

 

 

 

 

 

 

 

 

 

Supongo que te gusta

Origin blog.csdn.net/m0_46405589/article/details/115264633
Recomendado
Clasificación