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 引擎。感谢您的澄清。
(这个答案可能比你想要的更多。它是对问题根源的深入讨论,加上多种解决方案。)
很久以前,当 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。这通常可以安全地完成,但您应该检查数据,并了解它限制了您可以使用的字符串。INDEX (col(191))
. 这有两个负面影响:(1) 如果索引是真的UNIQUE
,你会得到对唯一性约束的错误解释。(2) 性能可能会因为前缀的低效而受到影响。innodb_large_prefix=1
(5.7.7 中的默认值)、innodb_file_format=Barracuda
、innodb_file_per_table=1
、ROW_FORMAT
=DYNAMIC
或COMPRESSED
。如果 WordPress 主动解决您遇到的问题,那就太好了。
(更新)在以后的版本中,这些被弃用(5.7和10.2?),因为他们不再是必要的:innodb_file_format
,innodb_file_format_check
,innodb_file_format_max
和innodb_large_prefix
。如果您遇到了这种情况的错误,请不要费心设置它们。它们实际上在 8.0 / 10.4(?)