在latin1中查询速度快,在utf8中查询速度慢 - 为什么?

时间:2011-01-29 02:13:44

标签: sql mysql performance join

我有一个类似这样的查询:

 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作为客户端字符集运行时,对同一数据库的此查询运行正常(< 1s运行时),并且在SET NAMES 'utf8'之后非常慢(无法等待它完成)。查询返回70行(当然是限制之前的部分),因此结果集大小应该不是问题。我检查了所有连接中的所有表,它们似乎都有UTF-8作为它们的字符集(我用SHOW TABLE CREATE检查)。

什么可能导致这种奇怪的行为?在这种情况下utf8如何比latin1更糟糕? 如果它是相关的,ID字段在任何地方都是char(36),并且连接具有基于这些字段和整数字段和varchar字段的条件。

P.S。我知道DISTINCT可能需要时间,但我无法移除它,无论如何它都是70行,并且在默认(latin1)设置下快速!所以它看起来像查询外部的东西,但是什么?

1 个答案:

答案 0 :(得分:0)

当您使用utf8表示我们时,它为每行分配3倍 varchar 的长度(256 * 3 = 768字节)!

这意味着你的查询占用了更多的资源,因为字符串占用了三倍的空间 - 所以缓冲区不是那么大,如果有很多查询同时进行,你可能不得不换掉 - 这会进一步降低查询/服务器的性能。