通过常规int在mysql表中使用smallint数据类型是否会真正提高内存使用率?硬件是否仍不为所有数据分配完整的64位字长?如果它不分配完整的单词,那么我们是否不会因为必须从分配给内存的64位单词中解析出多个smallint或tinyints而导致性能下降?
基本上,假设我们知道Status
列中存储的值的范围将永远不会超出smallint的最大/最小范围,那么使用下表而不是其后的设计/内存/性能会有什么好处?任何见解将不胜感激:
create table `TestTableWithSmallInt` (
`ID` bigint(20) NOT NULL AUTO_INCREMENT,
`Status` smallint(11) DEFAULT 0,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
create table `TestTableWithInt` (
`ID` bigint(20) NOT NULL AUTO_INCREMENT,
`Status` int(11) DEFAULT 0,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
最佳答案
理论上,您将每行节省两个字节,SMALLINT
是16位带符号整数,而INT
是32位带符号整数。 various types have varying storage requirements。
通常,在INT
和SMALLINT
之间节省的费用可显着改善性能,以至于您很难测量它,尤其是当您要修剪的字段数量很少时。
相反,仅在可能会耗尽BIGINT
标记字段的数字空间的情况下,才希望使用AUTO_INCREMENT
。
您可能应该以裸露的类型声明它们,不加长度,以使其最佳匹配。 INT
比INT(11)
更可取,并且SMALLINT(11)
具有误导性,因为不可能从16位值中获得这么高的精度。
关于mysql - 在MySQL中使用smallint数据类型替代int实际上会节省内存吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19038646/