1

我正在阅读 MySQL 文档,我想知道MyISAM 的“静态”表格式是否也适用于 InnoDB?如果我使用CHAR而不是VARCHAR实际长度在 0 到 100 个字符之间变化或使用VARCHAR(100)更好,我是否会获得性能?

4

2 回答 2

4

InnoDB 确实有固定宽度的行,将表中的所有列声明为固定宽度可能会有一些优势。主要好处是页面中的所有“洞”都可以重复用于任何插入,因为所有行的长度相同。这使得空间再利用更加有效。不过,我不会尝试对超过几十个字节的任何字符串强制使用固定宽度,因为每页存储额外数据(因此每页行数更少)的成本会很快超过您从更多字节中获得的任何节省/收益有效的空间再利用。

但是,拥有固定宽度的行不允许对行扫描进行任何优化(就像对 MyISAM 所做的那样)。InnoDB 的行存储始终是基于页面的,并且使用具有双向链接的页面列表和页面内的单链接记录的 B+树。行遍历总是使用这些结构,不能以任何其他方式完成。

于 2014-02-06T08:23:50.630 回答
0

有了CHAR字段,您分配的正是您得到的。例如,CHAR(15)分配并存储 15 个字节,无论您在字段中放置何种字符。字符串操作简单直接,因为数据字段的大小是完全可预测的。

有了VARCHAR字段,你会得到一个完全不同的故事。例如VARCHAR(15),实际上动态分配最多 16 个字节,最多 15 个用于数据,至少还有 1 个额外的字节来存储数据的长度。如果您要存储字符串“hello”,则需要 6 个字节,而不是 5 个字节。字符串操作在所有情况下都必须始终执行某种形式的长度检查。

我希望它对你有用

于 2014-02-06T08:00:36.583 回答