在mysql中使用smallint数据类型实际上是否可以节省内存?

时间:2013-09-26 21:03:15

标签: mysql

在mysql表中使用smallint数据类型而不是常规int实际上是否会提高内存使用率?难道硬件不会为所有数据分配完整的64位字大小吗?如果它没有分配一个完整的单词,那么我们不会因为必须从内存中分配的64位字中解析出多个smallint或tinyints而导致性能下降吗?

基本上,假设我们知道Status列中存储的值的范围永远不会超过最大/最小范围,使用下表后面的表是否有任何设计/内存/性能优势?小的?任何见解将不胜感激:

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;

2 个答案:

答案 0 :(得分:8)

理论上你每行会节省两个字节,SMALLINT是一个16位有符号整数,而INT是32位有符号整数。 various types have varying storage requirements

通常INTSMALLINT之间的节省会产生如此微小的性能提升,以至于您很难对其进行测量,特别是如果您正在以这种方式修剪少量字段。

相反,当您可以想象可能耗尽BIGINT标记字段的数字空间时,您只想使用AUTO_INCREMENT

你可能应该用裸露的类型声明它们,没有长度,以获得最佳效果。 INT优于INT(11)SMALLINT(11)具有误导性,因为无法从16位值获得那么高的精度。

答案 1 :(得分:1)

紧凑型内存块的数据挖掘速度更快。只有当编程语言发挥作用时,才会发生转换。