sql >> Base de Datos >  >> RDS >> Mysql

MySQL:comparación de valor entero y campo de cadena con índice

El punto esencial es que el índice no se puede usar si la base de datos tiene que hacer una conversión en el lado de la tabla de la comparación.

Además de eso, la base de datos siempre cubre Cadenas -> Números porque esta es la forma determinista (de lo contrario, 1 podría convertirse en '01', '001' como se menciona en los comentarios).

Entonces, si comparamos los dos casos que parecen confundirte:

-- index is used
EXPLAIN SELECT * FROM a_table WHERE int_column = '1';

La base de datos convierte la cadena '1' en el número 1 y luego ejecuta la consulta. Finalmente tiene int en ambos lados para que pueda usar el índice.

-- index is NOT used. WTF?
EXPLAIN SELECT * FROM a_table WHERE str_column = 1;

De nuevo, convierte la cadena en números. Sin embargo, esta vez tiene que convertir los datos almacenados en la tabla. De hecho, está realizando una búsqueda como cast(str_column as int) = 1 . Eso significa que ya no está buscando en los datos indexados, la base de datos no puede usa el índice.

Por favor, eche un vistazo a esto para obtener más detalles: