【问题标题】:Does using smallint datatype over int in mysql actually save memory?在 mysql 中使用 smallint 数据类型而不是 int 实际上可以节省内存吗?
【发布时间】:2013-09-26 21:03:15
【问题描述】:

在 mysql 表中使用 smallint 数据类型而不是常规 int 是否实际上提高了内存使用率?无论如何,硬件不会为所有数据分配一个完整的 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;

【问题讨论】:

    标签: mysql


    【解决方案1】:

    理论上每行可以节省两个字节,SMALLINT 是 16 位有符号整数,而INT 是 32 位有符号整数。 various types have varying storage requirements

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

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

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

    【讨论】:

    • 也许这更像是一个硬件问题?我对 64 位架构的理解是,即使是最小的可能值仍会占用 64 位字长。如果是这样,smallint 不会仍然使用与 int 相同的 64 位内存块吗?如此有效地,将字段声明为 smallint 只会对该字段施加最大值,而不会实际节省任何内存?感谢顺便声明裸类型的建议:)
    • 事实并非如此。也许您正在考虑对齐问题,但 16 位值是 aligned on 4-byte boundaries 而不是 8。除非您可以以有意义的方式测量 MySQL 的内存占用量,否则我真的不会担心这一点,而且我从来没有必要关心我自己的详细程度。计算机有千兆字节的内存,并且有一些优化可以更紧密地打包数据,这几乎不是问题。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-19
      • 2017-02-14
      • 2012-07-26
      • 2023-03-15
      • 2011-09-06
      • 1970-01-01
      • 2015-08-15
      • 2012-03-24
      相关资源
      最近更新 更多