sql >> Database teknologi >  >> RDS >> Mysql

Er der ulemper ved at bruge en generisk varchar(255) til alle tekstbaserede felter?

På lager, VARCHAR(255) er smart nok til kun at gemme den længde, du har brug for på en given række, i modsætning til CHAR(255) som altid gemmer 255 tegn.

Men siden du taggede dette spørgsmål med MySQL, vil jeg nævne et MySQL-specifikt tip:da rækker kopieres fra lagermotorlaget til SQL-laget, VARCHAR felter konverteres til CHAR for at opnå fordelen ved at arbejde med rækker med fast bredde. Så strengene i hukommelsen bliver polstret til den maksimale længde af din deklarerede VARCHAR kolonne.

Når din forespørgsel implicit genererer en midlertidig tabel, for eksempel under sortering eller GROUP BY , dette kan bruge meget hukommelse. Hvis du bruger meget VARCHAR(255) felter for data, der ikke behøver at være så lange, kan dette gøre den midlertidige tabel meget stor.

Du vil måske også gerne vide, at denne "udfyldning"-adfærd betyder, at en streng, der er erklæret med utf8-tegnsættet, udfyldes til tre bytes pr. tegn, selv for strenge, du gemmer med enkeltbyte-indhold (f.eks. ascii- eller latin1-tegn). Og ligeledes får utf8mb4 tegnsæt strengen til at udfyldes til fire bytes pr. tegn i hukommelsen.

Altså en VARCHAR(255) i utf8 lagring af en kort streng som "Ingen mening" tager 11 bytes på disken (ti lavere tegnsæt plus en byte for længden), men det tager 765 bytes i hukommelsen og dermed i midlertidige tabeller eller sorterede resultater.

Jeg har hjulpet MySQL-brugere, der ubevidst oprettede 1,5 GB midlertidige tabeller ofte og fyldte deres diskplads. De havde masser af VARCHAR(255) kolonner, der i praksis lagrede meget korte strenge.

Det er bedst at definere kolonnen baseret på den type data, du har til hensigt at gemme. Det har fordele at håndhæve applikationsrelaterede begrænsninger, som andre har nævnt. Men det har de fysiske fordele at undgå det hukommelsesspild, jeg beskrev ovenfor.

Det er selvfølgelig svært at vide, hvad den længste postadresse er, og derfor vælger mange mennesker en lang VARCHAR det er bestemt længere end nogen adresse. Og 255 er sædvanligt, fordi det er den maksimale længde af en VARCHAR hvor længden kan kodes med én byte. Det var også den maksimale VARCHAR længde i MySQL ældre end 5.0.



  1. Hvordan udfører jeg en lagret procedure én gang for hver række, der returneres af forespørgsel?

  2. Opret ikke bare blindt de manglende indekser!

  3. PostgreSQL sletning med indre joinforbindelse

  4. Hvordan viser man rækkenumre i PostgreSQL-forespørgsel?