Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Sollte MEDIUMINT in MySQL vermieden werden?

InnoDB speichert MEDIUMINT als 3-Byte-Wert. Aber wenn MySQL eine Berechnung durchführen muss, werden die 3 Byte MEDIUMINT in 8 Byte unsigned long int umgewandelt (ich nehme an, niemand führt MySQL heutzutage mit 32 Bit aus).

Es gibt Vor- und Nachteile, aber Sie verstehen, dass die Argumentation „Es ist dumm und langsam und der Code, der es implementiert, ein kriechender Horror“ nicht technisch ist, oder?

Ich würde sagen, dass MEDIUMINT sinnvoll ist, wenn die Datengröße auf der Festplatte kritisch ist. D.h. wenn eine Tabelle so viele Datensätze hat, dass sogar ein Byte Unterschied (4 Bytes INT vs. 3 Bytes MEDIUMINT) viel bedeutet. Es ist eher ein seltener Fall, aber möglich.

mach_read_from_3 und mach_read_from_4 – Primitive, die InnoDB verwendet, um Zahlen aus InnoDB-Datensätzen zu lesen, sind ähnlich. Beide geben ultint zurück. Ich wette, Sie werden bei keinen einen Unterschied bemerken Arbeitsbelastung.

Schauen Sie sich einfach den Code an:

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])
                );
}

Glauben Sie, dass es viel langsamer ist?

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])
                );
}