在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;
答案 0 :(得分:8)
理论上你每行会节省两个字节,SMALLINT
是一个16位有符号整数,而INT
是32位有符号整数。 various types have varying storage requirements。
通常INT
和SMALLINT
之间的节省会产生如此微小的性能提升,以至于您很难对其进行测量,特别是如果您正在以这种方式修剪少量字段。
相反,当您可以想象可能耗尽BIGINT
标记字段的数字空间时,您只想使用AUTO_INCREMENT
。
你可能应该用裸露的类型声明它们,没有长度,以获得最佳效果。 INT
优于INT(11)
而SMALLINT(11)
具有误导性,因为无法从16位值获得那么高的精度。
答案 1 :(得分:1)
紧凑型内存块的数据挖掘速度更快。只有当编程语言发挥作用时,才会发生转换。