【发布时间】: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,查看标签 ;)
标签: sql mysql performance join