InnoDB stocke MEDIUMINT sous la forme d'une valeur de trois octets. Mais lorsque MySQL doit effectuer un calcul, les trois octets MEDIUMINT sont convertis en un int long non signé de huit octets (je suppose que personne n'exécute MySQL sur 32 bits de nos jours).
Il y a du pour et du contre, mais vous comprenez que le raisonnement "C'est bête, et c'est lent, et le code qui l'implémente est une horreur rampante" n'est pas technique, n'est-ce pas ?
Je dirais que MEDIUMINT a du sens lorsque la taille des données sur le disque est critique. C'est à dire. lorsqu'une table contient tellement d'enregistrements que même une différence d'octet (4 octets INT contre 3 octets MEDIUMINT) signifie beaucoup. C'est plutôt un cas rare, mais possible.
mach_read_from_3 et mach_read_from_4 - les primitives utilisées par InnoDB pour lire les nombres des enregistrements InnoDB sont similaires. Ils renvoient tous les deux ulint. Je parie que vous ne remarquerez aucune différence sur aucun charge de travail.
Jetez un œil au 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])
);
}
Pensez-vous que c'est beaucoup plus lent que cela ?
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])
);
}