mysql - 增加 varchar 长度会减少 MySQL 的大小吗?

标签 mysql sql

我有一个大约有 100000 行的表。它有 62.6 MB,并且没有任何开销。我将 2 列从 varchar(255) 更改为 varchar(2047)。这些列用于 URL。 更改后,表的行数仍然相同,但大小减少到 59.2 MB。

我很困惑为什么会发生这种情况。 varchar(2047) 不应该是相同大小或更大吗?有人可以解释为什么 varchar 长度的增加会导致尺寸变小吗?

最佳答案

VARCHAR 和 CHAR 差异

  • CHAR 长度是固定的。例如: CHAR(30) 意味着它将存储固定的 30 个字符,即使您插入一个 value 为 10 个字符,它会尝试添加一些填充。

enter image descriptionhere

  • VARCHAR 是可变大小的长度。 VARCHAR(300) 表示最多存储 300 个字符。数据库没有为其保留300字节。它只会存储您输入的长度。

enter image description here

  • 当您更新具有更大长度的新值时,它将使用溢出指针。

enter image description here

尺寸减小

我不知道确切的原因,但这是我所相信的。

  • 当你删除一条记录时,MySQL并没有真正删除。它只是将记录标记为已删除,并在插入新数据时重复使用。
  • 已删除的记录通过链表(对于可变大小的记录)进行维护,以便可以快速找到已删除的记录以供重用。

enter image description here

  • 这意味着,当您删除数据时,数据库的大小仍保持不变,直到您运行 OPTIMIZE TABLE your_table_name 再次重新组织数据库。
  • 我认为导致大小减小的原因是当您更改表架构时,数据库将尝试再次重新组织数据库,以便不再删除数据或使用空间。

关于mysql - 增加 varchar 长度会减少 MySQL 的大小吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24112248/

相关文章:

mysql - 更新mysql需要好的语句

sql - 根据 3 个标准获取不同的值

sql - 使用 Azure 上的正则表达式将列分解为多个列?

mysql - Mysql 中的条件扇出过滤器

c# - 通过 .NET 从 SQL 服务器下载可执行文件是否可能甚至合乎逻辑?

php - 检查 mySQL 数据库中现有用户的最佳方法?

java - 如何使用准备好的语句从数据库中选择实体

java - 如何从过程中的第二个 select 语句返回结果集?

mysql - 使用 2 个表中的列进行更新

sql - 从 SQL*Loader 控制文件中访问数据文件名