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

Existují nevýhody použití obecného varchar(255) pro všechna textová pole?

V úložišti, VARCHAR(255) je dostatečně chytrý na to, aby na daný řádek uložil pouze délku, kterou potřebujete, na rozdíl od CHAR(255) který by vždy uložil 255 znaků.

Ale protože jste tuto otázku označili pomocí MySQL, zmíním tip specifický pro MySQL:protože se řádky kopírují z vrstvy úložiště do vrstvy SQL, VARCHAR pole jsou převedena na CHAR získat výhodu práce s řádky s pevnou šířkou. Řetězce v paměti se tedy vyplní na maximální délku z vašeho deklarovaného VARCHAR sloupec.

Když váš dotaz implicitně generuje dočasnou tabulku, například při řazení nebo GROUP BY , může to spotřebovat hodně paměti. Pokud používáte hodně VARCHAR(255) pole pro data, která nemusí být tak dlouhá, může to způsobit, že dočasná tabulka bude velmi velká.

Možná by vás také zajímalo, že toto chování „vyplňování“ znamená, že řetězec deklarovaný pomocí znakové sady utf8 se doplní na tři bajty na znak i pro řetězce, které ukládáte s jednobajtovým obsahem (např. znaky ASCII nebo latin1). A podobně znaková sada utf8mb4 způsobí, že se řetězec vyplní na čtyři bajty na znak v paměti.

Takže VARCHAR(255) v utf8 ukládání krátkého řetězce jako "Žádný názor" zabere 11 bajtů na disku (deset znaků nižší znakové sady plus jeden bajt pro délku), ale zabere 765 bajtů v paměti, a tedy v dočasných tabulkách nebo seřazených výsledcích.

Pomohl jsem uživatelům MySQL, kteří nevědomky často vytvářeli 1,5GB dočasné tabulky a zaplňovali si místo na disku. Měli spoustu VARCHAR(255) sloupce, které v praxi uchovávaly velmi krátké řetězce.

Nejlepší je definovat sloupec na základě typu dat, která chcete uložit. Má výhody prosazování omezení souvisejících s aplikací, jak již zmínili jiní lidé. Ale má to fyzické výhody, aby se zabránilo plýtvání pamětí, které jsem popsal výše.

Je samozřejmě těžké zjistit, jaká je nejdelší poštovní adresa, a proto mnoho lidí volí dlouhý VARCHAR to je určitě delší než jakákoli adresa. A 255 je obvyklé, protože je to maximální délka VARCHAR u kterého lze délku zakódovat jedním bajtem. Byla to také maximální hodnota VARCHAR délka v MySQL starší než 5.0.



  1. Fixing Lock časový limit překročení; zkuste restartovat transakci pro „zaseknutou tabulku Mysql?

  2. Chyba při odesílání paketu QUERY

  3. Jak získat row_number v MySQL

  4. Proč mají celá čísla v databázi řádků n-tice příponu 'L'?