11

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

基本上,假设我们知道存储在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;
4

2 回答 2

9

理论上每行可以节省两个字节,aSMALLINT是 16 位有符号整数,INT而 a 是 32 位有符号整数。各种类型有不同的存储要求。

INT通常情况下,两者之间的节省SMALLINT会产生如此微小的性能改进,以至于您很难衡量它,特别是如果您以这种方式修剪的字段数量很少。

相反,您只想使用 aBIGINT当您可能会耗尽AUTO_INCREMENT标记字段的数字空间时。

您可能应该在它们的裸类型中声明它们,没有长度,以获得最合适的。INT比 16 位值更可取INT(11)并且SMALLINT(11)具有误导性,因为不可能从 16 位值中获得如此高的精度。

于 2013-09-26T21:08:10.383 回答
1

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

于 2013-09-26T21:07:35.497 回答