我有一个类似这样的查询:
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)设置下快速!所以它看起来像查询外部的东西,但是什么?
答案 0 :(得分:0)
当您使用utf8
表示我们时,它为每行分配3倍 varchar 的长度(256 * 3 = 768字节)!
这意味着你的查询占用了更多的资源,因为字符串占用了三倍的空间 - 所以缓冲区不是那么大,如果有很多查询同时进行,你可能不得不换掉 - 这会进一步降低查询/服务器的性能。