InnoDB ukládá MEDIUMINT jako tříbajtovou hodnotu. Ale když má MySQL provést jakýkoli výpočet, tři bajty MEDIUMINT se převedou na osm bajtů bez znaménka long int (předpokládám, že v dnešní době nikdo nepoužívá MySQL na 32 bitech).
Existují klady a zápory, ale chápete, že zdůvodnění typu „Je to hloupé, je to pomalé a kód, který to implementuje, je děsivý“ není technické, že?
Řekl bych, že MEDIUMINT má smysl, když je kritická velikost dat na disku. Tj. když tabulka má tolik záznamů, že i jeden bajtový rozdíl (4 bajty INT vs 3 bajty MEDIUMINT) znamená hodně. Je to spíše vzácný případ, ale možný.
mach_read_from_3 a mach_read_from_4 - primitiva, která InnoDB používá ke čtení čísel ze záznamů InnoDB, jsou podobná. Oba vrátí ulint. Vsadím se, že na žádném nezaznamenáte rozdíl pracovní zátěž.
Stačí se podívat na kód:
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])
);
}
Myslíte si, že je to mnohem pomalejší než toto?
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])
);
}