我试图了解mysql如何在磁盘上存储ROW / Records,是二进制格式吗?它如何存储varchar字段?是否与表中的其他固定长度数据字段分开存储?
所以,例如table employee(id int,name varchar(64),salary decimal(10,2));我在这张表中有1000条记录。该表如何存储在磁盘上。将列名定义为char(64)会使此表上的选择查询更快。
我正在尝试优化具有大量varchar字段的表。
问题特定于InnoDB引擎类型。
答案 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()是有意义的。