在常规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)
从理论上讲,每行可以节省两个字节,a SMALLINT是一个16位有符号整数,INT而不是32 位有符号整数.在各类有不同的存储需求.
通常情况下节省INT和SMALLINT产生如此微小的性能提升,你将很难测量它,特别是如果有少量的领域你正在修剪这种方式.
相反,你BIGINT可能只想使用一个可以想象你可能耗尽AUTO_INCREMENT标记字段的数字空间.
你可能应该用裸露的类型声明它们,没有长度,以获得最佳效果.因为不可能从16位值获得那么高的精度,所以它INT是优选的INT(11)并且SMALLINT(11)具有误导性.
| 归档时间: |
|
| 查看次数: |
2791 次 |
| 最近记录: |