应该在mysql中避免使用mediumint吗?

Sto*_*toz 12 mysql

我发现以下博客文章的评论建议不要使用mediumint:

即使在MySQL中,也不要使用[24位INT].这是愚蠢的,它很慢,实现它的代码是一个爬行恐怖.

4294967295和MySQL INT(20)语法Blows

stackoverflow的答案还指出SQL Server,Postgres和DB2不支持mediumint.

MySQL中的tinyint,smallint,mediumint,bigint和int有什么区别?

应该避免使用中,还是应该在最能代表我存储数据的情况下继续使用?

aku*_*sky 10

InnoDB将MEDIUMINT存储为三个字节的值.但是当MySQL必须进行任何计算时,三个字节MEDIUMINT被转换为8个字节的unsigned long int(我假设现在没有人在32位上运行MySQL).

有利有弊,但你明白"这是愚蠢的,它很慢,实现它的代码是一种爬行的恐怖"推理不是技术性的,对吧?

我想说当磁盘上的数据大小至关重要时,MEDIUMINT是有意义的.即,当一个表有如此多的记录,即使一个字节的差异(4字节INT与3字节MEDIUMINT)意味着很多.这是一种罕见的情况,但可能.

mach_read_from_3和mach_read_from_4 - InnoDB用于从InnoDB记录中读取数字的原语是类似的.他们都返回ulint.我打赌你不会注意到任何工作量的差异.

只需看看代码:

ulint
mach_read_from_3(
/*=============*/
        const byte*     b)      /*!< in: pointer to 3 bytes */
{
        ut_ad(b);
        return( ((ulint)(b[0]) << 16)
                | ((ulint)(b[1]) << 8)
                | (ulint)(b[2])
                );
}
Run Code Online (Sandbox Code Playgroud)

你认为它比这慢得多吗?

ulint
mach_read_from_4(
/*=============*/
        const byte*     b)      /*!< in: pointer to four bytes */
{
        ut_ad(b);
        return( ((ulint)(b[0]) << 24)
                | ((ulint)(b[1]) << 16)
                | ((ulint)(b[2]) << 8)
                | (ulint)(b[3])
                );
}
Run Code Online (Sandbox Code Playgroud)