InnoDB memorizza MEDIUMINT come valore di tre byte. Ma quando MySQL deve eseguire qualsiasi calcolo, i tre byte MEDIUMINT vengono convertiti in otto byte unsigned long int (presumo che nessuno esegua MySQL su 32 bit al giorno d'oggi).
Ci sono pro e contro, ma capisci che il ragionamento "È stupido ed è lento e il codice che lo implementa è un orrore strisciante" non è tecnico, giusto?
Direi che MEDIUMINT ha senso quando la dimensione dei dati su disco è critica. Cioè. quando una tabella ha così tanti record che anche una differenza di un byte (4 byte INT vs 3 byte MEDIUMINT) significa molto. È un caso piuttosto raro, ma possibile.
mach_read_from_3 e mach_read_from_4 - le primitive che InnoDB usa per leggere i numeri dai record InnoDB sono simili. Entrambi restituiscono Ulin. Scommetto che non noterai alcuna differenza su nessuna carico di lavoro.
Basta dare un'occhiata al codice:
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])
);
}
Pensi che sia molto più lento di così?
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])
);
}