【问题标题】:Why is my query taking twice as long when I change to the field to utf8?当我将字段更改为 utf8 时,为什么我的查询需要两倍的时间?
【发布时间】:2009-01-21 08:21:35
【问题描述】:

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

如果有问题或这是否正常,有什么想法吗?

我正在运行 MySQL 5.0。

【问题讨论】:

    标签: mysql query-optimization


    【解决方案1】:

    latin1_swedish_ci 是一个每个字符一个八位字节的编码系统。一旦您知道比较字符和整个字符串的排序(或排序)顺序就相对简单了。

    utf8_general_ci 每个字符需要一到四个八位字节。以这种编码方式解码八位字节数据比较困难,因此需要的时间较长。

    【讨论】:

      【解决方案2】:

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

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

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

      由于这个问题标有“查询优化”,您需要问自己是否真的需要表示更多“异国情调”字符,或者是否需要在单八位字节系统中表示这些字符(例如纯 ASCII-表)足以满足您的需求。因为就其性质而言,utf8 会消耗更多的 CPU/内存。

      【讨论】:

        【解决方案3】:

        您的查询看起来如何?

        您是否可以在该字段上使用过滤器,并将参数的数据类型指定为非 utf8 数据类型?在这种情况下,DBMS 将不得不进行一些强制转换,这会影响性能。

        【讨论】:

        • 该字段纯粹在 order by 中使用,where 子句中有其他 tinyint(1) 字段。
        猜你喜欢
        • 2011-07-27
        • 1970-01-01
        • 2020-03-23
        • 2022-11-10
        • 1970-01-01
        • 2017-04-01
        • 2017-04-21
        • 1970-01-01
        • 2014-06-09
        相关资源
        最近更新 更多