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

Měly by být sloupce VARCHAR umístěny na konec definic tabulek v MySQL?

Ptát se na tuto otázku o "MySQL" není užitečné, protože MySQL odsouvá úložiště na úložiště enginů a ty implementují úložiště velmi odlišnými způsoby. Tuto otázku má smysl položit každému jednotlivému úložišti.

V modulu MEMORY neexistují datové typy s proměnnou délkou. VARCHAR se tiše změní na CHAR. V kontextu vaší otázky:Nezáleží na tom, kam v definici tabulky zadáte svůj VARCHAR.

V enginu MyISAM, pokud tabulka nemá žádná data s proměnnou délkou (VARCHAR, VARBINARY nebo jakýkoli typ TEXT nebo BLOB), jedná se o FIXED variantu MyISAM, to znamená, že záznamy mají pevnou délku bajtů. To může mít dopad na výkon, zejména pokud jsou data mazána a vkládána opakovaně (tj. tabulka není pouze připojena). Jakmile je jakýkoli datový typ s proměnnou délkou součástí definice tabulky, stane se DYNAMICKOU variantou MyISAM a MyISAM interně změní jakýkoli kromě nejkratšího typu CHAR interně na VARCHAR. Opět, na poloze a dokonce i definici CHAR/VARCHAR nezáleží.

V enginu InnoDB jsou data uložena na stránkách o velikosti 16 KB. Stránka má zápatí stránky s kontrolním součtem a záhlaví stránky, mimo jiné také adresář stránky. Adresář stránek obsahuje pro každý řádek posun tohoto řádku vzhledem k začátku stránky. Stránka také obsahuje volné místo a všechny I/O se provádějí po stránkách.

InnoDB tedy může, pokud je na stránce volné místo, zvětšovat VARCHAR na místě a přesouvat řádky uvnitř stránky, aniž by došlo k dalším I/O. Vzhledem k tomu, že všechny řádky jsou adresovány jako (číslo stránky, záznam v adresáři stránek), je pohyb řádku uvnitř stránky lokalizován na stránku a není viditelný zvenčí.

To také znamená, že i pro InnoDB nezáleží na pořadí sloupců v řádku vůbec.

Toto jsou tři moduly úložiště, které se nejčastěji používají s MySQL, a pořadí sloupců u žádného z těchto tří nezáleží. Je možné, že existují jiné, exotičtější úložné motory, pro které to není pravda.



  1. Model seznamu sousedství vs model vnořených sad pro hierarchická data MySQL?

  2. Vícenásobné levé spojení se součtem

  3. Mysql rozdělení a spojení

  4. Dochází při používání cizích klíčů na serveru SQL k závažnému narušení výkonu?