我原本将我的字段设置为latin1_swedish_ci
,我将其更改为utf8_general_ci
(字段和表),然后发现我的查询从〜1.8秒变为〜3.3。我有一个字段的索引,甚至重新创建索引(删除然后添加)。该字段按子句顺序使用。为什么当我将字段更改为utf8时,我的查询需要两倍的时间?
任何想法,如果可能有问题或这是正常的?
我正在运行MySQL 5.0。
我原本将我的字段设置为latin1_swedish_ci
,我将其更改为utf8_general_ci
(字段和表),然后发现我的查询从〜1.8秒变为〜3.3。我有一个字段的索引,甚至重新创建索引(删除然后添加)。该字段按子句顺序使用。为什么当我将字段更改为utf8时,我的查询需要两倍的时间?
任何想法,如果可能有问题或这是正常的?
我正在运行MySQL 5.0。
latin1_swedish_ci
是一个一个八位字节的字符编码系统。一旦你知道比较字符和整个字符串的排序(或排序)顺序是相对平凡的。
utf8_general_ci
每个字符需要1到4个八位字节。在这种编码中解码八位位组数据更困难,所以需要更长的时间。
我自己并不经常使用mysql,但我可能会对问题的出处提供一些见解。
latin1_swedish_ci字符集是一个八位字节编码系统,这意味着用这个系统编码的每个字符都只占用一个字节。将其与utf8_general_ci字符集进行对比,其中每个字符由每个字符1到4个八位字节组成,这意味着需要1到4个字节来表示每个字符。
这有一个明显的缺点,即utf8字符占用更多的空间,更多的内存,最重要的是,更多的cpu时间来识别。最明显的优势是utf8字符可以编码任何unicode字符。
由于此问题标有'查询优化',所以您需要问自己,您是否真的需要表示更多'异国情调'的字符,或者如果是单字节系统中表示的字符(例如纯ASCII - 表)足够满足您的需求。由于其性质,utf8会吃更多的CPU /内存。
你的查询是怎样的?
是否可以在该字段上使用过滤器,并且指定参数的数据类型为非utf8数据类型?在这种情况下,数据库管理系统将不得不进行一些铸造,这会妨碍性能。
该字段纯粹用于by和where子句中的其他tinyint(1)字段。 – 2009-01-21 18:31:00