UTF-8与Latin1 mysql,utf-8上的索引未被使用

8
我尝试使用UTF-8和Latin1字符集创建mysql表。当我使用Latin1时,我的索引被使用,但当我使用UTF-8时,在选择/限制记录时索引没有被使用。是否有什么我忽略的字符集设置导致这种情况发生?祝好!Ke
3个回答

8

只有当表达式的排序规则与索引列上的排序规则相匹配时,才能使用索引。

如果表达式的 COERCIBILITY 低于列的 COERCIBILITY(即 2),则将列的排序规则强制转换为表达式的排序规则,并且不使用索引。

通常,字面量的 COERCIBILITY4,用户变量的 COERCIBILITY3,因此这应该不是问题。

但是,如果您在 JOINUNION 中混合使用不同的排序规则,则无法保证转换顺序。

在这种情况下,您应该为要强制转换的列提供显式的排序规则(最可能是您想将 latin1 转换为 UTF8),并且这应该是您要转换到的列的排序规则:

SELECT  *
FROM    utf_table
JOIN    latin_table
ON      utf_column = latin_column COLLATE UTF8_GENERAL_CI

谢谢@Quassnoi,你能提供一些官方文件吗?我想了解更多。 - zhuguowei
@zhuguowei:http://dev.mysql.com/doc/refman/5.7/zh-cn/information-functions.html#function_coercibility - Quassnoi
谢谢!但我想更了解这个问题:“仅当表达式的排序规则与索引列上的排序规则相匹配时,才可以使用索引。”因为最近我遇到了这个问题“where a.user_id (UTF8MB4_UNICODE_CI) = b.user_id (utf8_bin)”并且两个表的'user_id'都进行了索引,但实际上它非常缓慢,明显索引没有起作用。 - zhuguowei

3
我现在明白了,我连接的表不是相同字符集的。
DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

我改变了这些内容后,索引就正常工作了。


1
索引本身与它们所索引的列使用相同的编码进行存储。将一个UTF-8字符与一个latin1字符进行比较无法利用索引,因为它需要将两者转换为相同的编码,由于索引优化是在字节级别上执行的(并且在latin1中的ß具有不同的字节序列),因此无法使用索引。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接