Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在mysql中使用smallint数据类型是否真的节省了内存?_Mysql - Fatal编程技术网

在mysql中使用smallint数据类型是否真的节省了内存?

在mysql中使用smallint数据类型是否真的节省了内存?,mysql,Mysql,在mysql表中使用smallint数据类型而不是常规int是否确实提高了内存使用率?硬件不会为所有数据分配一个完整的64位字大小吗?如果它不分配一个完整的字,那么我们是否会看到性能下降,因为必须从内存中分配的64位字中解析出多个小整数或小整数 基本上,假设我们知道存储在Status列中的值的范围永远不会超过smallint的最大/最小范围,那么在下表之后使用下表是否有任何设计/内存/性能优势?如有任何见解,将不胜感激: create table `TestTableWithSmallInt`

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

基本上,假设我们知道存储在
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位有符号整数。这个

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

相反,只有在可能耗尽
AUTO_INCREMENT
标记字段的数字空间时,才需要使用
BIGINT


您可能应该以裸类型声明它们,不带长度,以获得最佳拟合
INT
INT(11)
更可取,
SMALLINT(11)
具有误导性,因为不可能从16位值中获得那么高的精度。

那么这可能更像是一个硬件问题?我对64位体系结构的理解是,即使是最小的值也会占用64位字的大小。如果是这样的话,smallint不会仍然使用与int相同的64位内存块吗?这么说来,将字段声明为smallint只会在字段上施加一个最大值,而不会实际节省任何内存?谢谢你关于声明裸类型的建议顺便说一下:)事实并非如此。也许您正在考虑对齐问题,但16位值不是8。我真的不会担心这一点,除非你能以一种有意义的方式测量MySQL的内存占用,而且我从来没有考虑过这样的细节。计算机有千兆字节的内存,并且有优化来更紧密地打包数据,这很少引起关注。