【问题标题】:Meaning of 3 byte numeric in mysql (MEDIUMINT)mysql中3字节数字的含义(MEDIUMINT)
【发布时间】:2010-11-12 13:03:20
【问题描述】:

Funny thing我找到了 mysql。 MySQL 有一个 3 字节的数字类型 - MEDIUMINT。它的范围是从-8388608到8388607。对我来说似乎很奇怪。为获得更好的性能而选择的数字类型的大小,我认为数据应该与机器字或双字对齐。如果我们需要一些数值范围的限制规则,它必须相对于数据类型是外部的。例如:

CREATE TABLE ... (
  id INT RANGE(0, 500) PRIMARY KEY
)

那么,有谁知道为什么是 3 个字节?有什么原因吗?

【问题讨论】:

  • 有趣的问题 - 你得到了我的支持。

标签: mysql types


【解决方案1】:

您提到的对齐问题主要适用于 RAM 中的数据。没有什么能强制 MySQL 在处理它时使用 3 个字节来存储该类型。

不过,这可能对更有效地使用磁盘缓存有一点好处。

【讨论】:

  • 是的,但是现代处理器没有使用 3 字节数据的指令。当取 3 个字节数的总和时,处理器会将两个 4 字节数与零填充的高位字节相加。它是否正确?我在 3 字节数字上看到的唯一优势是空间。在大型数据集上,3-bte 数字将小 25%。
  • 是的,没错。不过我通常不会使用那种数据类型;)
【解决方案2】:

原因是,如果您有一个在 3 字节范围内的数字,则使用 4 字节存储它不会浪费空间。

当你有 200 亿行时,这很重要。

【讨论】:

  • 空间在数据库操作中非常重要。
  • 这没有回答对齐问题,这是原始问题的重点。
  • Mehrdad 回答说:对齐对于我所说的目的来说并不重要。
【解决方案3】:

我们经常使用tinyintsmallintmediumint 来节省空间。请记住,它使您的索引更小。

当您有非常小的连接表时,这种效果会被放大,例如:

id1 smallint unsigned not null,
id2 mediumint unsigned not null,
primary key (id1, id2)

然后您就有数亿或数十亿条记录。

【讨论】:

  • 处理器无法比较 3 字节数字。所以在内存索引中每个索引位置应该包含 4 个字节。如果您使用 mediumint,您确定索引大小为 3 字节长吗?
猜你喜欢
  • 2016-10-20
  • 2014-06-07
  • 2018-06-08
  • 2012-07-26
  • 2010-12-16
  • 2019-06-17
  • 2021-12-24
  • 1970-01-01
  • 2014-03-17
相关资源
最近更新 更多