2014-06-16 59 views
-1

我想知道如何在磁盘上存储ROWs /记录,它是二进制格式?它如何存储varchar字段?是否与表中存在的其他固定长度数据字段分开存储?MySQL的varchar数据类型..如何获取存储在磁盘

因此,例如,表员工(id int,名称varchar(64),薪金小数(10,2));我在这张表中有1000条记录。这张表如何存储在磁盘上。将列名称定义为char(64)会使此表上的select查询更快。

我想优化有很多varchar字段的表。

问题特定于InnoDB引擎类型。

+0

你究竟想要做什么?问题本身(如何将行存储在磁盘上)确实听起来很像[XY问题](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。你打算优化什么? “SELECT”表现?磁盘空间? 'INSERT' /'UPDATE'性能? – vhu

+0

选择性能。同时尝试了解varchar文件如何存储。 – user3743918

回答

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()浪费空间。

不关心数据的内部存储,数据库管理系统将自己做这件事,你不能为用户优化它。你的SELECT性能将是寻找记录的问题,这是设置好的索引而不是传输时间的问题。你的例子是一个纯学术的例子,即使对于更大的表格来说,如果你连续检索大量数据,转换时间也是非常重要的。

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

+0

谢谢马丁! – user3743918

0

VARCHAR(x)以字符串+它的长度存储。

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

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

相关问题