Mysql
 sql >> Database >  >> RDS >> Mysql

MEDIUMINT dovrebbe essere evitato in MySQL?

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