sql >> Base de Datos >  >> RDS >> Mysql

¿Se debe evitar MEDIUMINT en MySQL?

InnoDB almacena MEDIUMINT como valor de tres bytes. Pero cuando MySQL tiene que hacer algún cálculo, los tres bytes MEDIUMINT se convierten en ocho bytes sin firmar long int (supongo que nadie ejecuta MySQL en 32 bits hoy en día).

Hay pros y contras, pero entiendes que el razonamiento "Es tonto y lento, y el código que lo implementa es un horror reptante" no es técnico, ¿verdad?

Diría que MEDIUMINT tiene sentido cuando el tamaño de los datos en el disco es crítico. Es decir. cuando una tabla tiene tantos registros que incluso una diferencia de byte (4 bytes INT frente a 3 bytes MEDIUMINT) significa mucho. Es un caso bastante raro, pero posible.

mach_read_from_3 y mach_read_from_4:las primitivas que utiliza InnoDB para leer números de los registros de InnoDB son similares. Ambos devuelven ulint. Apuesto a que no notarás la diferencia en ninguna carga de trabajo.

Solo echa un vistazo al código:

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

¿Crees que es mucho más lento que esto?

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