我有一个MySQL数据库表,其中包含varchar(386)类型的列。我选择了这个字符数,因为我事先计算了最长条目的字符。我目前有400,000个条目,但预计会随着时间的推移而增加。
我进行了一些测试,发现大约390,000个条目只使用60个或更少的字符,而最后10,000个条目最多使用386个字符。
我应该将10,000个大型条目分成单独的表吗?我该如何实施呢?从长远来看,这会提高我的查询速度效率吗?
答案 0 :(得分:1)
VARCHAR
与表格内联存储。当大小合理时,VARCHAR
更快,其权衡速度更快取决于您的数据和硬件,您希望将真实世界场景与您的数据进行基准测试。
可以存储在VARCHAR
或VARBINARY
列中的有效最大字节数受65,535 bytes
的最大行大小限制,该行大小在所有列之间共享。
例如,VARCHAR(255)
列可以包含最大长度为255个字符的字符串。假设该列使用latin1字符集(每个字符一个字节),所需的实际存储量是字符串(L)的长度,加上一个字节来记录字符串的长度。对于字符串'abcd'
,L
为4
,存储要求为五个字节。如果声明同一列使用ucs2
双字节字符集,则存储要求为10个字节:' abcd'是八个字节,该列需要两个字节来存储长度,因为最大长度大于255(最多510 bytes
)。
对于较大的数据,请考虑使用TEXT
或BLOB
。 TEXT
和BLOB
列在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
如果您很少在查询中使用该字段,则取决于您的数据库关系。例如,有关其他信息。创建分隔表是很好的选择(规范化)。
注意: VARCHAR
与CHAR
不同。如果您创建VARCHAR(250)
并仅在其上插入20
个字符,那么5 bytes
+ L
与CHAR(250)
不同,将需要250 bytes
+ L
表示相同的条件。
答案 1 :(得分:0)
仅仅因为该字段是varchar(386)并不意味着它占用了每行的那么多空间。如果您的大部分日期不超过60个字符,那么这些记录将只为该列使用60个或更少的字符。
如果对您的逻辑数据模型有意义,我认为您可以安全地将该列留在表中。