Los índices solo se pueden usar cuando la intercalación de la expresión coincide con la de la columna indexada.
Si la expresión es COERCIBILITY
es menor que la de la columna (es decir, 2
), la intercalación de la columna se convierte en la de la expresión y el índice no se utiliza.
Normalmente, los literales tienen COERCIBILITY
de 4
y las variables de usuario de 3
, por lo que esto no debería ser un problema.
Sin embargo, si mezcla diferentes intercalaciones en un JOIN
o UNION
, no se garantiza el orden del elenco.
En este caso, debe proporcionar el cotejo explícita a la columna de su son de fundición (muy probablemente, quieres lanzar latin1
a UTF8
), y esto debe ser la intercalación de la columna que está echando a:
SELECT *
FROM utf_table
JOIN latin_table
ON utf_column = latin_column COLLATE UTF8_GENERAL_CI
Gracias @Quassnoi ¿podría proporcionar algún documento oficial sobre esto? Quiero saber más. – zhuguowei
@zhuguowei: http://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_coercibility – Quassnoi
¡Gracias! pero quiero saber más de esto: 'Los índices se pueden usar solo cuando la intercalación de la expresión coincide con la de la columna indexada'. Porque recientemente conocí este problema' donde a.user_id (UTF8MB4_UNICODE_CI) = b.user_id (utf8_bin) ' y tanto la tabla 'user_id' está indexada y en realidad es muy lenta, explícitamente el índice no funciona. – zhuguowei