当我将字段更改为utf8时,为什么我的查询需要两倍的时间?

时间:2009-01-21 08:21:35

标签: mysql query-optimization

我最初将我的字段设置为latin1_swedish_ci,我将其更改为utf8_general_ci(字段和表格),然后发现我的查询从~1.8秒变为~3.3。我在该字段上有一个索引,甚至重新创建了索引(删除然后添加)。该字段用于order by子句。

任何想法,如果可能有问题或这是正常的吗?

我正在运行MySQL 5.0。

3 个答案:

答案 0 :(得分:4)

latin1_swedish_ci是一个每个字符一个八位字节的编码系统。一旦你知道整理(或排序)顺序,比较字符和整个字符串是相对微不足道的。

utf8_general_ci每个字符需要1到4个八位字节。在此编码中解码八位字节数据更难,因此需要更长时间。

答案 1 :(得分:2)

我自己经常不使用mysql,但我可能会对问题所在的位置提供一些见解。

latin1_swedish_ci字符集是一个单八位字节编码系统,这意味着用该系统编码的每个字符只占用一个字节。将此与utf8_general_ci字符集进行对比,其中每个字符由每个字符一到四个八位字节组成,这意味着需要一到四个字节来表示每个字符。

这有一个明显的缺点,即utf8字符占用更多空间,更多内存,最重要的是,更多的cpu时间来识别。最明显的优点是utf8字符可以编码任何unicode字符。

由于此问题标有“查询优化”,因此您需要问自己是否真的需要表示更具“异国情调”的字符,或者是否需要表示单八位字节系统中的字符(例如纯ASCII格式)表)足以满足您的需求。由于其性质,utf8将占用更多的CPU /内存。

答案 2 :(得分:0)

您的查询如何?

是否有可能在该字段上使用过滤器,并且您将参数的数据类型指定为非utf8数据类型?在这种情况下,DBMS必须进行一些转换,这会妨碍性能。