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

enc*_*est 10 mysql

在常规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;
Run Code Online (Sandbox Code Playgroud)

tad*_*man 9

从理论上讲,每行可以节省两个字节,a SMALLINT是一个16位有符号整数,INT而不是32 位有符号整数.在各类有不同的存储需求.

通常情况下节省INTSMALLINT产生如此微小的性能提升,你将很难测量它,特别是如果有少量的领域你正在修剪这种方式.

相反,你BIGINT可能只想使用一个可以想象你可能耗尽AUTO_INCREMENT标记字段的数字空间.

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

  • 事实并非如此。也许您正在考虑对齐问题,但是16位值[对齐4字节边界](http://software.intel.com/zh-cn/articles/data-alignment-when-migrating-to-而不是64位英特尔架构)8.除非您能以有意义的方式衡量MySQL的内存占用空间,否则我真的不会担心这一点,而且我也不必担心该细节级别。计算机具有千兆字节的内存,并且进行了优化以更紧密地打包数据,这几乎不用担心。 (2认同)