我的印象是将 int 字段设置为有符号与无符号不会节省任何空间。今天我将一些列设置为无符号,因为它们永远不会存储负值,并且注意到表大小减少了 15%。当我将它们的 int 列设置为无符号时,我的一些表的大小没有减小,一些表的大小大大减小了。有人对此有解释吗?
最佳答案
@Frank Schmitt 和@Kenny 是正确的 - 如果您只观察数据类型更改前后的文件大小,您会看到不同的效果。有符号整数和无符号整数各占用 4 个字节,两者都不是更节省空间的。
当您添加或更改列时,以及在其他一些情况下,MySQL 会执行表重组。也就是说,它将表的内容复制到一个新文件,完成后删除旧文件并重命名新文件。
如果旧文件由于过去的 DELETE 操作而有大量未使用的空间,它在磁盘上看起来会比其中的数据大。您可以使用以下方法更精确地测量数据和索引使用的空间:
mysql> SHOW TABLE STATUS FROM mydatabasename LIKE 'mytablename'\G
该状态的data_length
和index_length
字段显示所需的空间。另一个字段 data_free
显示数据文件中的碎片空间量,当您执行 ALTER TABLE 时,应该(或多或少)回收这些空间量。
关于Mysql:将 int 字段设置为 unsigned 可以节省大量空间。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7666565/