在 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 中查询慢 - 为啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 Web App 中查询慢,但在命令行中查询快

如何将数据库中的所有字段从 latin1_swedish_ci 更改为 utf8_general_ci?

用文字查询慢,用变量查询快 - Oracle/Toad

查询第一次执行慢,但第二次/第三次执行快

通过 Ajax 请求的 json:查询非常快,但响应返回非常慢

mySql为啥查询时有时快,有时慢