Mysql:将 int 字段设置为 unsigned 可以节省大量空间。为什么?

标签 mysql

我的印象是将 int 字段设置为有符号与无符号不会节省任何空间。今天我将一些列设置为无符号,因为它们永远不会存储负值,并且注意到表大小减少了 15%。当我将它们的 int 列设置为无符号时,我的一些表的大小没有减小,一些表的大小大大减小了。有人对此有解释吗?

最佳答案

@Frank Schmitt 和@Kenny 是正确的 - 如果您只观察数据类型更改前后的文件大小,您会看到不同的效果。有符号整数和无符号整数各占用 4 个字节,两者都不是更节省空间的。

当您添加或更改列时,以及在其他一些情况下,MySQL 会执行表重组。也就是说,它将表的内容复制到一个新文件,完成后删除旧文件并重命名新文件。

如果旧文件由于过去的 DELETE 操作而有大量未使用的空间,它在磁盘上看起来会比其中的数据大。您可以使用以下方法更精确地测量数据和索引使用的空间:

mysql> SHOW TABLE STATUS FROM mydatabasename LIKE 'mytablename'\G

该状态的data_lengthindex_length 字段显示所需的空间。另一个字段 data_free 显示数据文件中的碎片空间量,当您执行 ALTER TABLE 时,应该(或多或少)回收这些空间量。

关于Mysql:将 int 字段设置为 unsigned 可以节省大量空间。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7666565/

相关文章:

mysql - RoR 使用 2 个不同的数据库和事件记录适配器?相同的表名

java - JDBC一次执行多个语句

mysql - 一对多关系中仅具有主标志的一条记录的唯一索引

连接查询中的 MySQL 条件字段

MySQL 查询带有意外的加号

php - password_verify 返回 false

PHP:准备数据数组以安全插入 MySQL

mysql - SQL Server多数据库nodejs连接

mysql - 使用 union mysql 选择查询进行分组

PHP SQL语法错误设置变量