mysql中3字节数字的含义(MEDIUMINT)

mysql中3字节数字的含义(MEDIUMINT),mysql,types,Mysql,Types,我找到了关于mysql的信息。MySQL有一个3字节的数字类型-MEDIUMINT。其范围从-8388608到8388607。我觉得很奇怪。数字类型的大小选择为了更好的性能,我认为数据应该与机器字或双字对齐。如果我们需要一些数字范围的限制规则,它必须是相对于数据类型的外部规则。例如: CREATE TABLE ... ( id INT RANGE(0, 500) PRIMARY KEY ) 那么,有人知道为什么是3字节吗?有什么原因吗?您提到的对齐问题主要适用于RAM中的数据。没有什么强迫

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

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

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

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


不过,这在更有效地使用磁盘缓存方面可能有一个小优势。

原因是,如果数字在3字节范围内,则不会因为使用4字节存储而浪费空间


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

我们经常使用
tinyint
smallint
mediumint
作为非常显著的空间节省。请记住,它会使索引变得更小

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

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

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

是的,但现代处理器没有处理3字节数据的指令。当取3字节数之和时,处理器将用零填充的高阶字节对两个4字节数求和。这是正确的吗?我在3字节数字上看到的唯一优势是空间。在大型数据集上,3-bte数字将减少25%。是的,这是真的。不过,我通常不会使用这种数据类型;)空间在数据库操作中非常重要。这并不能回答对齐问题,而对齐问题正是最初问题的重点。Mehrdad回答说:对齐与我所说的目的无关。处理器无法比较3字节的数字。所以内存中的索引应该在每个索引位置上包含4个字节。如果你使用mediumint,你是否认为索引大小是3字节长的舒尔?有趣的问题-你得到了我的支持。