Wordpress 使用 varchar(255) 作为 InnoDB 和 utf8mb4_unicode_ci 的索引?

Dav*_*rer 3 mysql index varchar wordpress

我正在尝试更多地了解正确的数据库构建的细节,但遇到了一些让我感到困惑的事情。在当前的 Wordpress 安装中,我发现用于索引的 varchar 字段长于 191 个字符,文档似乎说这是最大值。我正在运行 MariaDB 10.x,我相信它与 MySQL 5.7 匹配,并且文档确认了使用 utf8mb4_unicode_ci 整理和压缩作为格式时的限制。

我正在查找 varchar(200) 和 varchar(255) 索引字段,例如 wp_postmeta,字段 meta_key 是 varchar(255)。我错了还是对此感到困惑?数据库使用 InnoDB 引擎。感谢您的澄清。

Ric*_*mes 5

(这个答案可能比你想要的更多。它是对问题根源的深入讨论,加上多种解决方案。)

很久以前,当 MySQL 添加 时CHARACTER SET utf8,每个字符最多需要 3个字节。并且索引被限制为 767字节,对于.VARCHAR(255)

utf8mb4的溶液中加入(因为UTF8不全),编码需要最多4字节/炭,但指数限值没有增加。(糟糕。)因此,索引(对于 utf8mb4)被限制为 191 个字符((767-2)/4)。

这个问题一直持续到 5.5 和 5.6(MariaDB 5.5 - 10.1?)。5.7 收拾东西。

这个问题有很多解决方案:

  • 改回utf8. 大多数用户可以摆脱这一点。但是,如果您需要表情符号或所有中文,则需要utf8mb4.
  • 将您的索引限制VARCHARs为 191 而不是 255。这通常可以安全地完成,但您应该检查数据,并了解它限制了您可以使用的字符串。
  • (请参阅 jkavalik 的评论)使用“前缀”索引: INDEX (col(191)). 这有两个负面影响:(1) 如果索引是真的UNIQUE,你会得到对唯一性约束的错误解释。(2) 性能可能会因为前缀的低效而受到影响。
  • 在 5.5.14、5.6.3、5.7.7、MariaDB 5.5 中,以下组合将限制从 767 提高到 3072: innodb_large_prefix=1(5.7.7 中的默认值)、innodb_file_format=Barracudainnodb_file_per_table=1ROW_FORMAT=DYNAMICCOMPRESSED

如果 WordPress 主动解决您遇到的问题,那就太好了。

(更新)在以后的版本中,这些被弃用(5.7和10.2?),因为他们不再是必要的:innodb_file_formatinnodb_file_format_checkinnodb_file_format_maxinnodb_large_prefix。如果您遇到了这种情况的错误,请不要费心设置它们。它们实际上在 8.0 / 10.4(?)