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í:
- 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;
- De esta forma, hay 100.000 filas de datos que cumplen las condiciones;
- Debido a que está seleccionado *, tiene que volver a la tabla 100.000 veces;
- 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';
- El resultado devuelto está vacío.