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

La consulta Mysql no usa el índice cuando hay variables en DONDE

La explicación más probable es que la columna nodo es el tipo de datos del carácter y character_set_connection no coincide con el conjunto de caracteres especificado para la columna.

Si la columna se define con latin1 juego de caracteres, intente:

WHERE nodo = CONVERT(@sitio USING latin1)

Como demostración, con utf8, la salida de explicación no muestra ningún índice disponible:

EXPLAIN SELECT t.* FROM mytable t WHERE t.foo = CONVERT(@foo USING utf8)
                                                                  ^^^^
id select_type table type possible_keys key    key_len ref    rows Extra        
-- ----------- ----- ---- ------------- ------ ------- ------ ---- -----------
 1 SIMPLE      t     ALL  (NULL)        (NULL) (NULL)  (NULL)    3 Using where

Pero con latin1, la salida de explicación muestra que el índice está disponible (y se usa):

EXPLAIN SELECT t.* FROM mytable t WHERE t.foo = CONVERT(@foo USING latin1)
                                                                  ^^^^^^    
id select_type table type possible_keys key    key_len ref    rows Extra        
-- ----------- ----- ---- ------------- ------ ------- ------ ---- -----------
 1  SIMPLE     t     ref  t_ix          t_ix   13      const     1 Using where