假设有一个包含 varchar 字段的表,如下所示:
CREATE TABLE IF NOT EXISTS `users` (
`name` varchar(150) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
MySQL 数据库大小是否取决于 varchar 长度?我的意思是:当我将用户插入表中时,数据库大小是否会增加 150 个字节,与实际条目内容无关?或者它是否取决于有效数据大小(如果我插入“abc”作为用户名,数据库仅增加 3 个字节)?在决定 varchar 长度时是否有最佳实践?
最佳答案
不,不完全是。
大多数常见的关系数据库使用一个称为“页”的概念,它是具有一定存储大小的 block 。然后在这些页面中存储行。 varchar
字段,根据其定义,仅占用字符串实际所需的存储空间,但可能需要也可能不需要新页面来包含其行。此外,随着行被删除,添加和修改的间隙将出现在页面中,直到表格被优化或重新使用。这一切都是正常且良好的,因为在大多数情况下,DBMS 本身就是这样在内部设法保持高性能的。
总结:字段大小和数据库大小之间存在松散的关系,但在任何给定时间点,数据库明显大于其数据总和是正常的。然而,在大多数引擎中,具有 10 个数据字符的 varchar(150)
本身不会使用超过 11 个字节(取决于编码,包括尾随零)。
至于最佳实践:是的,varchar
的大小应该“合理地能够包含其域的最大可能字符串”。 varchar(1024)
对 FirstName
字段没有意义,varchar(16)
对 City< 不起作用
。使用常识,存储无关紧要。
关于MySQL 数据库大小 VS varchar 长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27687188/