在SQL表的列中分离大小相关数据是否更有效?

时间:2015-01-28 04:20:17

标签: mysql

我有一个MySQL数据库表,其中包含varchar(386)类型的列。我选择了这个字符数,因为我事先计算了最长条目的字符。我目前有400,000个条目,但预计会随着时间的推移而增加。

我进行了一些测试,发现大约390,000个条目只使用60个或更少的字符,而最后10,000个条目最多使用386个字符。

我应该将10,000个大型条目分成单独的表吗?我该如何实施呢?从长远来看,这会提高我的查询速度效率吗?

2 个答案:

答案 0 :(得分:1)

VARCHAR与表格内联存储。当大小合理时,VARCHAR更快,其权衡速度更快取决于您的数据和硬件,您希望将真实世界场景与您的数据进行基准测试。

可以存储在VARCHARVARBINARY列中的有效最大字节数受65,535 bytes的最大行大小限制,该行大小在所有列之间共享。

例如,VARCHAR(255)列可以包含最大长度为255个字符的字符串。假设该列使用latin1字符集(每个字符一个字节),所需的实际存储量是字符串(L)的长度,加上一个字节来记录字符串的长度。对于字符串'abcd'L4,存储要求为五个字节。如果声明同一列使用ucs2双字节字符集,则存储要求为10个字节:' abcd'是八个字节,该列需要两个字节来存储长度,因为最大长度大于255(最多510 bytes)。

对于较大的数据,请考虑使用TEXTBLOBTEXTBLOB列在NDB存储引擎中的实现方式不同,其中TEXT列中的每一行都由两个独立的部分组成。其中一个是固定大小(256 bytes),实际上存储在原始表中。另一个包含超过256 bytes的任何数据,该数据存储在隐藏表中。第二个表中的行始终为2,000 bytes长。这意味着如果TEXT(其中size表示行的大小),256列的大小为size <= 256;否则,大小为256 + size + (2000 – (size – 256) % 2000)

http://dev.mysql.com/doc/refman/5.6/en/storage-requirements.html

如果您很少在查询中使用该字段,则取决于您的数据库关系。例如,有关其他信息。创建分隔表是很好的选择(规范化)。

注意: VARCHARCHAR不同。如果您创建VARCHAR(250)并仅在其上插入20个字符,那么5 bytes + LCHAR(250)不同,将需要250 bytes + L表示相同的条件。

答案 1 :(得分:0)

仅仅因为该字段是varchar(386)并不意味着它占用了每行的那么多空间。如果您的大部分日期不超过60个字符,那么这些记录将只为该列使用60个或更少的字符。

如果对您的逻辑数据模型有意义,我认为您可以安全地将该列留在表中。