且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2022-10-22 13:02:48

InnoDB将MEDIUMINT存储为三个字节的值. 但是,当MySQL必须执行任何计算时,会将3个字节的MEDIUMINT转换为8个字节的无符号长整数(我假设现在没有人在32位上运行MySQL).

有优点也有缺点,但您了解这很愚蠢,而且速度很慢,实现它的代码令人毛骨悚然",这种推理不是技术性的吧?

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

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

只需看一下代码:

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

I came across a comment on the following blogpost that recommends against using 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

An answer on *** also notes that SQL Server, Postgres, and DB2 don't support mediumint.

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

Should mediumint be avoided or should I continue to use it in the cases where it best represents the data I am storing?

InnoDB stores MEDIUMINT as three bytes value. But when MySQL has to do any computation the three bytes MEDIUMINT is converted into eight bytes unsigned long int(I assume nobody runs MySQL on 32 bits nowadays).

There are pros and cons, but you understand that "It’s dumb, and it’s slow, and the code that implements it is a crawling horror" reasoning is not technical, right?

I would say MEDIUMINT makes sense when data size on disk is critical. I.e. when a table has so many records that even one byte difference (4 bytes INT vs 3 bytes MEDIUMINT) means a lot. It's rather a rare case, but possible.

mach_read_from_3 and mach_read_from_4 - primitives that InnoDB uses to read numbers from InnoDB records are similar. They both return ulint. I bet you won't notice a difference on any workload.

Just take a look at the code:

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

Do you think it's much slower than this?

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