sql >> Databáze >  >> RDS >> Mysql

Je třeba se v MySQL vyhnout MEDIUMINT?

InnoDB ukládá MEDIUMINT jako tříbajtovou hodnotu. Ale když má MySQL provést jakýkoli výpočet, tři bajty MEDIUMINT se převedou na osm bajtů bez znaménka long int (předpokládám, že v dnešní době nikdo nepoužívá MySQL na 32 bitech).

Existují klady a zápory, ale chápete, že zdůvodnění typu „Je to hloupé, je to pomalé a kód, který to implementuje, je děsivý“ není technické, že?

Řekl bych, že MEDIUMINT má smysl, když je kritická velikost dat na disku. Tj. když tabulka má tolik záznamů, že i jeden bajtový rozdíl (4 bajty INT vs 3 bajty MEDIUMINT) znamená hodně. Je to spíše vzácný případ, ale možný.

mach_read_from_3 a mach_read_from_4 - primitiva, která InnoDB používá ke čtení čísel ze záznamů InnoDB, jsou podobná. Oba vrátí ulint. Vsadím se, že na žádném nezaznamenáte rozdíl pracovní zátěž.

Stačí se podívat na kód:

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

Myslíte si, že je to mnohem pomalejší než toto?

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. Automatické zvýšení na částečném primárním klíči s Entity Framework Core

  2. Existuje nějaký rozdíl mezi DECIMAL a NUMERIC v SQL Server?

  3. Jak vrátit názvy měsíců a dnů v jiném jazyce v MariaDB

  4. Jak převést řetězec na velká písmena v SQL