通过常规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

通常,在INTSMALLINT之间节省的费用可显着改善性能,以至于您很难测量它,尤其是当您要修剪的字段数量很少时。

相反,仅在可能会耗尽BIGINT标记字段的数字空间的情况下,才希望使用AUTO_INCREMENT

您可能应该以裸露的类型声明它们,不加长度,以使其最佳匹配。 INTINT(11)更可取,并且SMALLINT(11)具有误导性,因为不可能从16位值中获得这么高的精度。

关于mysql - 在MySQL中使用smallint数据类型替代int实际上会节省内存吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19038646/

10-13 02:47