使用 ASCII/Latin 字符集是否可以加快数据库速度?

Does using ASCII/Latin Charset speed up the database?

似乎对大多数字段使用 ASCII 字符集,然后仅为需要它的字段指定 utf8 会减少 I/O 数据库必须执行的 100% 的数量。

有谁知道这是不是真的?

更新:以上并不是我的问题。我应该说:使用拉丁语作为默认字符集,然后只为需要它的字段指定 utf8mb4。想法是:使用 1 个字节与 2 个字节应该将 I/O 提高 100%。抱歉造成混淆。

简答:不值得担心。

长答案:

两期:

  • 速度:

将两种编码与相应的 _bin(ascii_bin 或 utf8_bin)COLLATION 进行比较就像比较字节一样简单——因此没有显着差异。其他排序规则可能不同,ascii 更快。 但是与获取行等的工作量相比,差异微不足道

  • Space:

Ascii 是 utf8 的子集。 utf8 只为每个 ascii 字符存储 1 个字节,就像 ascii 一样。所以,没有 space 区别。 (西欧的重音字母需要 1 字节 latin1 或 2 字节 utf8;因此不兼容且大小不同。)Space 导致缓存,这会导致性能略有差异。

对于英文文本,节省 0%。对于欧洲人,latin1 只会节省几个百分点;对于世界其他大部分地区,utf8 是唯一可行的解​​决方案。中文和Emoji,utf8mb4是必须的。

  • 温度tables

在某些情况下,字符串消耗的 space 会扩展到潜在的最大值。 country_code CHAR(2) CHARACTER SET ... 将占用 2 个字节用于 ascii; 6 个字节用于 utf8.

底线:

使用 ascii 表示国家代码、十六进制、邮政编码、uuid、md5s 等。如果您要国际化,and/or 需要表情符号,然后制作您的 "strings" utf8mb4。但这样做是因为它是 'right',而不是因为你会神奇地获得更快的速度;你不会。每当您创建 table; 时都这样做;坑了以后再改。

@RickJames 是对的,您不必担心通过选择 ASCII 或 utf8 而不是 utf8mb4 来节省 space。

utf8和utf8mb4是变长字符编码。 wikipedia 中的 table 说明了字符如何根据编码的值自动占用 1、2、3 或 4 个字节。如果设置了一个字节的高位,那么该字符使用一个额外的字节,最多4个字节。

维基百科文章解释得很清楚:

The first 128 characters (US-ASCII) need one byte. The next 1,920 characters need two bytes to encode, which covers the remainder of almost all Latin-script alphabets, and also Greek, Cyrillic, Coptic, Armenian, Hebrew, Arabic, Syriac, Thaana and N'Ko alphabets, as well as Combining Diacritical Marks. Three bytes are needed for characters in the rest of the Basic Multilingual Plane, which contains virtually all characters in common use including most Chinese, Japanese and Korean characters. Four bytes are needed for characters in the other planes of Unicode, which include less common CJK characters, various historic scripts, mathematical symbols, and emoji (pictographic symbols).

您无需执行任何操作即可选择单字节模式还是多字节模式。这就是编码的工作方式。每个字符自动使用它需要的字节数,不会再多了。

因此,使用 utf8 与 utf8mb4 没有任何优势,使用 ASCII 也没有任何优势,除非您需要限制字符串中允许的字符。

就其价值而言,字符集 MySQL 调用 "utf8" 是 utf8mb3 的别名,utf8mb3 只是 UTF8 编码的前三个字节的实现。 MySQL 服务器团队博客(https://mysqlserverteam.com/mysql-8-0-when-to-use-utf8mb3-over-utf8mb4/) says that utf8mb4 is faster, at least given performance improvements in MySQL 8.0, and utf8mb3 should be considered deprecated. MySQL 8.0.11 release notes 说 utf8 将在 MySQL 的某些未来版本中被重新定义为 utf8mb4 的别名。