我有一个名为users的表,它有一个列firstname和一个collation utf8_bin
当我执行如下查询时,我想知道在引擎盖下会发生什么情况:
SELECT * FROM `users` `a` WHERE `a`.`firstname` = 'sander' COLLATE utf8_general_ci列firstname不是索引,执行命令时性能如何?
如果默认的排序规则是utf8_general_ci,而查询是在没有COLLATE的情况下执行的,那么怎么办?
我想知道它对一张大桌子的影响。
发布于 2013-07-05 14:17:15
在这种情况下,由于强制排序规则是在与列的编码相同的字符集上定义的,因此不会对性能产生任何影响(相对于将该排序规则定义为列的默认值;而由于需要额外的查找/计算,utf8_general_ci在比较中的执行速度几乎肯定会比utf8_bin慢)。
但是,如果强制在不同字符集上定义排序规则,MySQL将不得不对列的值进行代码转换(这将对性能产生影响);我认为,如果强制排序规则位于Unicode字符集之上,它会自动执行该操作,或者在任何其他情况下都会引发“非法排序组合”错误。
请注意,根据列的定义记录的排序规则只是对MySQL的一个提示,而排序规则是首选的;根据表达的校对下面详细描述的规则,它可能在给定表达式中使用,也可能不使用。
https://dba.stackexchange.com/questions/45773
复制相似问题