InnoDB gemmer MEDIUMINT som en værdi på tre bytes. Men når MySQL skal udføre en hvilken som helst beregning, konverteres de tre bytes MEDIUMINT til otte bytes usigneret long int (jeg går ud fra, at ingen kører MySQL på 32 bit i dag).
Der er fordele og ulemper, men du forstår, at "det er dumt, og det er langsomt, og koden, der implementerer det, er en kravlende rædsel"-ræsonnement ikke er teknisk, vel?
Jeg vil sige, at MEDIUMINT giver mening, når datastørrelsen på disken er kritisk. dvs. når en tabel har så mange poster, at selv en byte forskel (4 bytes INT vs 3 bytes MEDIUMINT) betyder meget. Det er ret sjældent, men muligt.
mach_read_from_3 og mach_read_from_4 - primitiver, som InnoDB bruger til at læse tal fra InnoDB-poster, ligner hinanden. De vender begge tilbage ulint. Jeg vil vædde på, at du ikke vil bemærke en forskel på nogle arbejdsbyrde.
Bare tag et kig på koden:
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])
);
}
Tror du, det er meget langsommere end dette?
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])
);
}