gpt4 book ai didi

mysql - 在 MySQL 中应该避免使用 MEDIUMINT 吗?

转载 作者:IT老高 更新时间:2023-10-29 00:21:45 28 4
gpt4 key购买 nike

我在以下博文中看到一条建议不要使用 MEDIUMINT 的评论:

Don’t use [the 24bit INT], even in MySQL. It’s dumb, and it’s slow, and the code that implements it is a crawling horror.

4294967295 and MySQL INT(20) Syntax Blows

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

What is the difference between tinyint, smallint, mediumint, bigint and int in MySQL?


如果 MEDIUMINT 最能代表我正在存储的数据,我应该避免还是继续使用它?

最佳答案

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

有利有弊,但你明白“它很笨,很慢,实现它的代码是爬行的恐怖”推理不是技术性的,对吧?

当磁盘上的数据大小很关键时,我会说 MEDIUMINT 很有意义。 IE。当一个表有如此多的记录时,即使是一个字节的差异(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])
);
}

你觉得比这慢多了?

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

关于mysql - 在 MySQL 中应该避免使用 MEDIUMINT 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25255812/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com