在哪种情况下 MySQL 的 InnoDB 的 COMPACT row_format 会比 REDUNDANT 更 faster/better?

In which case would MySQL's InnoDB's COMPACT row_format would be faster/better than REDUNDANT?

我看到很多关于 Whosebug、DBA 和 Server Fault 的比较,但在特定情况下的性能方面,无论是使用 COMPACT 还是 REDUNDANT 行格式与 InnoDB

在某些情况下,一些简单的 tables 会带来明确的性能提升吗?例如,在一个简单的关系 table user_roles 中,它将 users table 映射到 roles table,使用两个 integers这将始终使磁盘上的行大小相同?

如果这不是一个很好的例子,是否有很好的例子可以产生明显的不同?

谢谢!

YMMV.

我很确定在这种情况下,很难将模式分类为 "this schema would be better (worse) using that row format"。

你没有提到DYNAMICCOMPRESSED,它们是在以后的版本中引入的。让我对所有 4 种格式发表意见...

最好查看您的代码是否利用了任何行格式。主要区别与 TEXT (等)列的处理有关。 SELECT * 要求返回所有列,但如果指定除文本列以外的所有列,查询将 可能 运行 快很多,因为行外不需要提取列。

将列的前 767 个字节包含在行的主要部分可能提供一些加速。但这取决于你在做什么,只能使用文本的第一部分, 是否有优化来实际利用特定情况。注意:"prefix indexes"(例如,INDEX my_text(44)仅在少数情况下有用。)

COMPRESSED 的实用性值得怀疑——在 buffer_pool 中包含压缩和未压缩副本会产生大量开销。我很难想象压缩明显更好的情况。而且压缩率通常只有 2:1。普通文本压缩为3:1。如果你有大 text/blob 字符串,我认为最好对选定的 TEXT 列进行客户端压缩(以减少网络带宽)并存储到 BLOBs.

如果你有一个 table 其中只有两个整数,将会有很多开销。参见SHOW TABLE STATUS;它可能会说 Avg_row_length 可能是 40 个字节。如果不包括 PRIMARY KEY.

甚至更多

此外,由于其他各种原因,除非 table 超过一百万行,否则很难在 "faster/better" 中看到很大差异。

底线:使用您的版本的默认值。不要因为这个决定而失眠。

性能关注索引和查询的制定。对于 space,测试您的 table 并报告。请注意,"free space" 有多种类型,其中大部分 未在任何地方报告 ,因此如果您在 table.[=20 处打喷嚏,尺码可能会发生变化=]

COMPACT 格式在存储字段长度方面稍好一些。 REDUNDANT 存储每个字段的长度,即使它是固定大小的 INT。 COMPACT 但是只存储可变长度字段的长度。

IMO 对性能差异的影响很小,因此不必担心格式。