sql >> Database >  >> RDS >> Mysql

Zijn er nadelen aan het gebruik van een generieke varchar(255) voor alle op tekst gebaseerde velden?

In opslag, VARCHAR(255) is slim genoeg om alleen de lengte op te slaan die je nodig hebt op een bepaalde rij, in tegenstelling tot CHAR(255) die altijd 255 tekens zou bevatten.

Maar aangezien je deze vraag hebt getagd met MySQL, noem ik een MySQL-specifieke tip:aangezien rijen worden gekopieerd van de storage-engine-laag naar de SQL-laag, VARCHAR velden worden geconverteerd naar CHAR om het voordeel te krijgen van het werken met rijen met vaste breedte. Dus de strings in het geheugen worden opgevuld tot de maximale lengte van uw gedeclareerde VARCHAR kolom.

Wanneer uw zoekopdracht impliciet een tijdelijke tabel genereert, bijvoorbeeld tijdens het sorteren of GROUP BY , dit kan veel geheugen gebruiken. Als u veel VARCHAR(255) . gebruikt velden voor gegevens die niet zo lang hoeven te zijn, kan dit de tijdelijke tabel erg groot maken.

Misschien vind je het ook leuk om te weten dat dit "padding-out"-gedrag betekent dat een string die is gedeclareerd met de utf8-tekenset opvult tot drie bytes per teken, zelfs voor strings die je opslaat met single-byte-inhoud (bijv. ascii- of latin1-tekens). En op dezelfde manier zorgt de utf8mb4-tekenset ervoor dat de tekenreeks uitloopt tot vier bytes per teken in het geheugen.

Dus een VARCHAR(255) in utf8 kost het opslaan van een korte string zoals "Geen mening" 11 bytes op schijf (tien tekens met een lagere tekenset, plus één byte voor de lengte), maar het kost 765 bytes in het geheugen, en dus in tijdelijke tabellen of gesorteerde resultaten.

Ik heb MySQL-gebruikers geholpen die onbewust vaak tijdelijke tabellen van 1,5 GB maakten en hun schijfruimte opvulden. Ze hadden veel VARCHAR(255) kolommen die in de praktijk zeer korte strings opsloegen.

U kunt de kolom het beste definiëren op basis van het type gegevens dat u wilt opslaan. Het heeft voordelen om toepassingsgerelateerde beperkingen af ​​te dwingen, zoals andere mensen al hebben gezegd. Maar het heeft de fysieke voordelen om de geheugenverspilling te voorkomen die ik hierboven heb beschreven.

Het is natuurlijk moeilijk om te weten wat het langste postadres is, daarom kiezen veel mensen voor een lange VARCHAR dat is zeker langer dan welk adres dan ook. En 255 is gebruikelijk omdat het de maximale lengte is van een VARCHAR waarvan de lengte kan worden gecodeerd met één byte. Het was ook de maximale VARCHAR lengte in MySQL ouder dan 5.0.



  1. SSIS Excel-import forceren van onjuist kolomtype

  2. Hoe de MySQL-databasegrootte voor uw database te krijgen?

  3. Maandag instellen als eerste dag van de week in SQL Server

  4. MySQL relationele databases gebruiken op Fedora 20