Dovresti provare a visualizzare una colonna varchar come faresti con una colonna char nella maggior parte degli scenari e impostare la lunghezza in modo conservativo. Non devi sempre pensare al modificatore var come a qualcosa che influisce sul tuo processo decisionale sulla lunghezza massima. In realtà dovrebbe essere visto come un suggerimento per le prestazioni invece che le corde fornite saranno di lunghezza variabile.
Non è una direttiva che deve essere rigorosamente seguita dagli interni del database, può essere completamente ignorata. Fai attenzione a questo, tuttavia, poiché a volte l'implementazione può perdere (lunghezza fissa e imbottitura per esempio) anche se non dovrebbe in un mondo ideale.
Se hai un varchar (255), non hai alcuna garanzia che le prestazioni si comporteranno sempre in modo diverso da un char (255) in tutte le circostanze.
Può sembrare facile impostarlo su qualcosa come 255, 65535, ecc. In linea con i consigli forniti nel manuale sui requisiti di archiviazione. Questo dà l'impressione che qualsiasi valore compreso tra 0 (sì, è una cosa) e 255 avrà lo stesso impatto. Tuttavia non è qualcosa che può essere completamente garantito.
I requisiti di archiviazione tendono ad essere veri o un buon indicatore per motori di archiviazione persistenti decenti e maturi in termini di archiviazione delle righe. Non è un indicatore così forte per cose come gli indici.
A volte è una domanda difficile, esattamente quanto dovrebbe essere lungo un pezzo di corda in modo da impostarlo fino al limite più alto che sai dovrebbe essere all'interno ma ciò non ha alcun impatto. Sfortunatamente questo è spesso qualcosa lasciato all'utente da risolvere ed è davvero un po 'arbitrario. Non puoi davvero dire mai sovradimensionare una stringa perché forse ci sono casi in cui non sei esattamente sicuro.
Dovresti assicurarti che le query MySQL generino un errore quando una stringa è troppo lunga piuttosto che troncare in modo che almeno tu sappia se potrebbe essere troppo breve per l'emissione di errori. Il ridimensionamento delle colonne per ingrandirle o rimpicciolirle può essere un'operazione DDL costosa, questo dovrebbe essere tenuto presente.
Il set di caratteri dovrebbe essere considerato anche dove entrano in gioco la lunghezza e le prestazioni. La lunghezza si riferisce a questo invece che ai byte. Se si utilizza utf8 ad esempio, (non MB4), varchar (255) è in realtà varbinary (3 * 255). È difficile sapere come andranno davvero a finire cose come questa senza eseguire test e analizzare a fondo il codice sorgente / la documentazione. Per questo motivo, è possibile che una lunghezza eccessiva abbia un impatto inaspettatamente gonfiato. questo non si applica solo alle prestazioni. Se un giorno hai bisogno di cambiare il set di caratteri di una colonna varchar in uno più grande, potresti finire per raggiungere un limite senza possibilità di ricorso se hai consentito la presenza di stringhe gratuitamente lunghe che avrebbero potuto essere evitate. Questo è normalmente un problema abbastanza di nicchia ma si presenta,
Se risulta che MAX (LENGTH (colonna)) è sempre <64 (come se fosse stato deciso che ci sarebbe stato un limite all'input che non corrispondeva alla definizione della colonna) ma hai varchar (255) allora c'è un buone possibilità che utilizzerai quattro volte più spazio del necessario in alcuni scenari.
Ciò potrebbe includere:
- Motori diversi, alcuni potrebbero ignorarlo del tutto.
- Le dimensioni del buffer, ad esempio l'aggiornamento o l'inserimento, potrebbero dover allocare l'intero 255 (sebbene non abbia controllato il codice sorgente per dimostrarlo, è solo ipotetico).
- Indici, questo sarà immediatamente ovvio se provi a creare una chiave composta da molte colonne varchar (255).
- Tabelle intermedie ed eventualmente set di risultati. Dato il modo in cui funzionano le transazioni, potrebbe non essere sempre possibile che qualcosa utilizzi la lunghezza massima effettiva delle stringhe in una colonna anziché il limite definito.
- Le ottimizzazioni predittive interne potrebbero prendere la lunghezza massima come input.
- Modifiche nelle versioni dell'implementazione del database.
Come regola generale, non c'è davvero bisogno che un varchar sia più lungo di quanto deve essere comunque, problemi di prestazioni o meno, quindi ti consiglio di attenersi a quello quando puoi. Fare uno sforzo maggiore per campionare la dimensione dei dati, imporre un limite reale o scoprire il vero limite attraverso domande / ricerche è l'approccio ideale.
Quando non puoi, se vuoi fare qualcosa come varchar (255) per i casi in cui sei in dubbio, ti consiglio di fare scienza. Ciò potrebbe consistere nel duplicare la tabella, ridurre la dimensione della colonna var char quindi copiare i dati in essa dall'originale e osservare la dimensione dei dati di indice / riga (indicizzare anche la colonna, provalo anche come chiave primaria che potrebbe comportarsi diversamente in InnoDB poiché le righe sono ordinate in base alla chiave primaria). Almeno in questo modo saprai se hai un impatto sull'IO che tende ad essere uno dei colli di bottiglia più sensibili. Testare l'utilizzo della memoria è più difficile, è difficile testarlo in modo esaustivo. Consiglierei di testare i potenziali casi peggiori (query con molti risultati intermedi in memoria, controllare con la spiegazione per tabelle temporanee di grandi dimensioni, ecc.).
Se sai che non ci saranno molte righe nella tabella, non utilizzerai la colonna per i join, gli indici (specialmente composti, univoci), ecc., Allora molto probabilmente non avrai molti problemi.
VARCHAR(255) utf8mb4
colonna indicizzata con ~ 150.000 righe misurava 11,5 MB. Una tabella con unaVARCHAR(48) utf8mb4
colonna indicizzata con gli stessi dati (lunghezza massima 46 caratteri) utilizzava 4,5 MB. Non è proprio una grande differenza nelle query, è indicizzato. Ma si somma con l'I / O delle query e cose come i backup del database.