我有个问题是这样的:
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/