MySQL 数据库大小 VS varchar 长度

标签 mysql database varchar

假设有一个包含 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/

相关文章:

mysql - 比较不同数据库上两个相同表结构的不同数据

sql - cassandra:单行可变列数

php - 必须插入varchar时如何将数组插入MySQL

mysql - 在 MySQL 中使用 varchar 而不是日期字段类型

php - MySQL从多个表中提取信息问题

sql - 备份数据库并删除敏感数据

mysql - 从表中选择一个值内至少有两行的数据

sqlite - sqlite 中 varchar 数据类型的最大大小限制是多少?

mysql - 通过在 MySQL 中搜索多列和多个值来选择行

mysql - JPA/Spring-boot key 'PRIMARY' 的重复条目