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

Ci sono degli svantaggi nell'usare un generico varchar(255) per tutti i campi basati su testo?

In archivio, VARCHAR(255) è abbastanza intelligente da memorizzare solo la lunghezza necessaria su una determinata riga, a differenza di CHAR(255) che memorizzerebbe sempre 255 caratteri.

Ma dal momento che hai taggato questa domanda con MySQL, menzionerò un suggerimento specifico per MySQL:poiché le righe vengono copiate dal livello del motore di archiviazione al livello SQL, VARCHAR i campi vengono convertiti in CHAR per ottenere il vantaggio di lavorare con righe a larghezza fissa. Quindi le stringhe in memoria vengono riempite alla lunghezza massima del tuo VARCHAR dichiarato colonna.

Quando la tua query genera implicitamente una tabella temporanea, ad esempio durante l'ordinamento o GROUP BY , questo può utilizzare molta memoria. Se usi molto VARCHAR(255) campi per dati che non devono essere così lunghi, questo può rendere la tabella temporanea molto grande.

Potresti anche voler sapere che questo comportamento di "padding out" significa che una stringa dichiarata con il set di caratteri utf8 riempie fino a tre byte per carattere anche per le stringhe memorizzate con contenuto a byte singolo (ad esempio caratteri ascii o latin1). E allo stesso modo il set di caratteri utf8mb4 fa sì che la stringa venga riempita fino a quattro byte per carattere in memoria.

Quindi un VARCHAR(255) in utf8 la memorizzazione di una stringa breve come "Nessuna opinione" richiede 11 byte su disco (dieci caratteri con un set di caratteri inferiore, più un byte per la lunghezza) ma richiede 765 byte in memoria, e quindi in tabelle temporanee o risultati ordinati.

Ho aiutato gli utenti MySQL che inconsapevolmente hanno creato frequentemente tabelle temporanee da 1,5 GB e hanno riempito il loro spazio su disco. Avevano molti VARCHAR(255) colonne che in pratica memorizzavano stringhe molto brevi.

È meglio definire la colonna in base al tipo di dati che si intende archiviare. Ha vantaggi nel far rispettare i vincoli relativi all'applicazione, come hanno già detto altre persone. Ma ha i vantaggi fisici per evitare lo spreco di memoria che ho descritto sopra.

È difficile sapere quale sia l'indirizzo postale più lungo, ovviamente, motivo per cui molte persone scelgono un VARCHAR lungo questo è certamente più lungo di qualsiasi indirizzo. E 255 è consuetudine perché è la lunghezza massima di un VARCHAR per cui la lunghezza può essere codificata con un byte. Era anche il massimo VARCHAR lunghezza in MySQL precedente a 5.0.