在 latin1 中查询快,在 utf8 中查询慢 - 为啥?
Posted
技术标签:
【中文标题】在 latin1 中查询快,在 utf8 中查询慢 - 为啥?【英文标题】:Query fast in latin1, slow in utf8 - why?在 latin1 中查询快,在 utf8 中查询慢 - 为什么? 【发布时间】:2011-06-17 14:36:48 【问题描述】:我有一个类似这样的查询:
SELECT DISTINCT table1.id, long list of fields FROM table1
INNER JOIN table2 ON table1.table2_id = table2.id
... more joins ...
LEFT JOIN table_last ON table_last.id=some_table.last_id
WHERE ( table_last.id IS NULL) AND ...more conditions...
ORDER BY table1.date_entered desc LIMIT 0,6
当使用 latin1 作为客户端字符集运行时,同一数据库上的此查询运行良好(SET NAMES 'utf8' 之后非常慢(无法等待它完成)。查询返回 70 行(当然是限制之前的部分),因此结果集大小应该不是问题。我检查了所有连接中的所有表,它们似乎都将 UTF-8 作为其字符集(我检查了 SHOW TABLE CREATE
)。
什么会导致这种奇怪的行为?在这种情况下,utf8 比 latin1 差多少?
如果相关,ID 字段在任何地方都是char(36)
,并且连接具有基于此类字段以及整数字段和 varchar 字段的条件。
附:我知道DISTINCT
可能需要一些时间,但我无法删除它,而且它有 70 行而且它在默认 (latin1) 设置下 很快!所以它看起来像是查询外部的东西,但是什么呢?
【问题讨论】:
你的表在什么排序规则中? @Pekka: utf8_general_ci 我认为 您使用的是哪个数据库?不过,我和 Pekka 在一起 - 这看起来像是一个与排序相关的问题 @StasM 你认为还是你确定? :) @blueberryfields mysql,查看标签 ;) 【参考方案1】:当您使用utf8
为我们提供表格时,它会为每行分配 3 倍的 varchar 长度(256 * 3 = 768 字节)!
这意味着您的查询占用了更多资源,因为字符串占用了三倍的空间 - 所以缓冲区没有那么大,如果同时进行许多查询,您可能必须换掉 -这会进一步降低您的查询/服务器的性能。
【讨论】:
这仍然不能解释问题。无论如何,这些表都是 UTF-8,只是 connection 排序规则发生了变化。以上是关于在 latin1 中查询快,在 utf8 中查询慢 - 为啥?的主要内容,如果未能解决你的问题,请参考以下文章
如何将数据库中的所有字段从 latin1_swedish_ci 更改为 utf8_general_ci?