在哪种情况下 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"。
你没有提到DYNAMIC
或COMPRESSED
,它们是在以后的版本中引入的。让我对所有 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 对性能差异的影响很小,因此不必担心格式。
我看到很多关于 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"。
你没有提到DYNAMIC
或COMPRESSED
,它们是在以后的版本中引入的。让我对所有 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 对性能差异的影响很小,因此不必担心格式。