InnoDBはMEDIUMINTを3バイト値として格納しますが、MySQLが計算を行う必要がある場合、3バイトのMEDIUMINTは8バイトのunsigned long intに変換されます(現在、32ビットでMySQLを実行している人はいないと思います)。
長所と短所がありますが、「それはばかげていて、遅く、それを実装するコードは這う恐怖です」という推論は技術的ではないことを理解していますか?
MEDIUMINTは、ディスク上のデータサイズが重要な場合に意味があります。つまりテーブルに非常に多くのレコードがあり、1バイトの違い(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])
);
}