MySQL varchar数据类型..如何存储在磁盘上

时间:2014-06-16 07:46:27

标签: mysql innodb database-performance

我试图了解mysql如何在磁盘上存储ROW / Records,是二进制格式吗?它如何存储varchar字段?是否与表中的其他固定长度数据字段分开存储?

所以,例如table employee(id int,name varchar(64),salary decimal(10,2));我在这张表中有1000条记录。该表如何存储在磁盘上。将列名定义为char(64)会使此表上的选择查询更快。

我正在尝试优化具有大量varchar字段的表。

问题特定于InnoDB引擎类型。

2 个答案:

答案 0 :(得分:0)

VARCHAR(x)存储为字符串+其长度。

CHAR(x)存储为x个字符的字符串。如果实际的刺痛短于x,则用空格填充。但是,如果CHAR(x)是utf8,则它存储为VARCHAR(x)。

我会说你不会注意到CHAR(x)和VARCHAR(x)之间有任何区别,所以要使用一个更有意义的。

答案 1 :(得分:0)

Char(64)将为每个记录使用64字节,对于1000行表,该字节为64,000字节。对于字符串长度,Varchar(64)将使用<length of string>字节和1字节开销。如果所有记录都有空字符串,则为(0 + 1)* 1000 = 1,000字节。如果您的所有记录的全长为64个字母,则为(64 + 1)* 1000 = 65,000字节。

如您所见,差异取决于您拥有的数据。如果使用固定长度的字符串,varchar()将为您提供不必要的开销。如果字符串的长度变化很大,则可能会使用char()来浪费空间。

不关心数据的内部存储,DBMS本身就会这样做,你无法像用户那样优化它。您的SELECT性能将是一个查找记录的问题,这是设置好的索引而不是传输时间的问题。您的示例纯粹是学术性的,即使对于更大的表,如果您连续检索大量数据,传输时间也很重要。

一般来说,如果你有真正固定长度的字符串和varchar(),那么使用char()是有意义的。