MySQL 中应该避免使用 MEDIUMINT 吗?

2024-01-29

我在以下博客文章中发现了一条建议不要使用的评论MEDIUMINT:

即使在 MySQL 中,也不要使用 [24 位 INT]。它很愚蠢,而且很慢,而且实现它的代码令人毛骨悚然。

4294967295 和 MySQL INT(20) 语法打击 http://laughingmeme.org/2010/01/24/4294967295-and-mysql-int20-syntax-blows/

Stack Overflow 上的一个答案还指出 SQL Server、PostgreSQL 和 DB2 不支持MEDIUMINT:

MySQL中tinyint、smallint、mediumint、bigint和int有什么区别? https://stackoverflow.com/questions/2991405/what-is-the-difference-between-tinyint-smallint-mediumint-bigint-and-int-in-m


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


InnoDB 将 MEDIUMINT 存储为三个字节值。 但是当MySQL必须进行任何计算时,三个字节MEDIUMINT被转换为八个字节无符号长整型(我假设现在没有人在32位上运行MySQL)。

有利有弊,但你明白“它很愚蠢,而且很慢,而且实现它的代码是令人毛骨悚然的恐怖”的推理不是技术性的,对吗?

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

mach_read_from_3 和 mach_read_from_4 - InnoDB 用于从 InnoDB 记录读取数字的原语是相似的。他们都返回 ulint。我打赌你不会注意到有什么不同any工作量。

看看代码:

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])
                );
}

你觉得比这个慢很多吗?

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])
                );
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL 中应该避免使用 MEDIUMINT 吗? 的相关文章

随机推荐