我有个问题是这样的:

 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),而join有基于这些字段、整数字段和varchar字段的条件。
注意,我知道DISTINCT可能需要时间,但我不能删除它,反正它是70行,而且它在默认(拉丁美洲1)设置上很快!所以它看起来像是查询外部的东西,但是什么呢?

最佳答案

当您使用utf8对我们进行表处理时,它为每行分配3倍的varchar长度(256*3=768字节)!
这将意味着,现在字符串占用了空间的三倍,查询将占用更多的资源——因此缓冲区没有那么大,如果同时进行了许多查询,则可能需要调出缓冲区——这将进一步降低查询/服务器的性能。

关于sql - 在latin1中快速查询,而在utf8中缓慢查询-为什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4834706/

10-12 00:04
查看更多