sql >> Database >  >> RDS >> Mysql

Moet MEDIUMINT worden vermeden in MySQL?

InnoDB slaat MEDIUMINT op als een waarde van drie bytes. Maar wanneer MySQL een berekening moet uitvoeren, wordt de drie bytes MEDIUMINT omgezet in acht bytes ongetekende lange int (ik neem aan dat niemand MySQL tegenwoordig op 32 bits draait).

Er zijn voor- en nadelen, maar je begrijpt dat "het is dom, en het is traag, en de code die het implementeert is een kruipende horror" redenering is niet technisch, toch?

Ik zou zeggen dat MEDIUMINT zinvol is wanneer de gegevensgrootte op de schijf van cruciaal belang is. D.w.z. wanneer een tabel zoveel records heeft dat zelfs één byte verschil (4 bytes INT versus 3 bytes MEDIUMINT) veel betekent. Het is eerder een zeldzaam geval, maar mogelijk.

mach_read_from_3 en mach_read_from_4 - primitieven die InnoDB gebruikt om getallen uit InnoDB-records te lezen, zijn vergelijkbaar. Ze keren allebei terug naar ulint. Ik wed dat je geen verschil zult merken op elke werklast.

Kijk maar eens naar de 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])
                );
}

Denk je dat het veel langzamer is dan dit?

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


  1. mySQL-query voor het selecteren van kinderen

  2. MYSQL-query / datums ouder dan 1 week geleden (alle datumtijden in UTC)

  3. SQL LIKE-query mislukt - fatale fout in voorbereide instructie

  4. Mogelijk om alles te verwijderen na een 'spatie' in het MySQL-veld?