Debería intentar ver una columna varchar de la misma manera que lo haría con una columna char en la mayoría de los escenarios y establecer la longitud de forma conservadora. No tiene que pensar siempre en el modificador var tanto como en algo que afecte su toma de decisiones sobre la longitud máxima. Realmente debería verse como una sugerencia de rendimiento en lugar de que las cadenas suministradas serán de diferentes longitudes.
No es una directiva que deba ser seguida estrictamente por los internos de la base de datos, se puede ignorar por completo. Sin embargo, tenga cuidado con esto, ya que a veces la implementación puede tener fugas (longitud fija y relleno, por ejemplo) aunque no debería hacerlo en un mundo ideal.
Si tiene un varchar (255), no tiene garantía de que el rendimiento siempre se comporte de manera diferente a un char (255) en todas las circunstancias.
Puede parecer fácil configurarlo en algo como 255, 65535, etc. en línea con los consejos dados en el manual sobre los requisitos de almacenamiento. Esto da la impresión de que cualquier valor entre 0 (sí, es una cosa) y 255 tendrá el mismo impacto. Sin embargo, eso no es algo que pueda garantizarse por completo.
Los requisitos de almacenamiento tienden a ser ciertos o un buen indicador de motores de almacenamiento persistentes decentes y maduros en términos de almacenamiento en filas. No es un indicador tan fuerte para cosas como índices.
A veces es una pregunta difícil, exactamente cuánto tiempo debe ser un trozo de cuerda para colocarlo en el límite más alto que sepa que debe estar, pero eso no tiene ningún impacto. Desafortunadamente, esto a menudo es algo que el usuario debe resolver y es algo arbitrario. Realmente no se puede decir nunca sobredimensionar una cuerda porque tal vez haya casos en los que no esté exactamente seguro.
Debe asegurarse de que las consultas de MySQL arrojen un error cuando una cadena sea demasiado larga en lugar de truncarse para que al menos sepa si puede ser demasiado corta debido a las emisiones de errores. Cambiar el tamaño de las columnas para agrandarlas o encogerlas puede ser una operación DDL costosa, esto debe tenerse en cuenta.
También se debe considerar el juego de caracteres cuando entran en juego la duración y el rendimiento. La longitud se refiere a esto en lugar de a bytes. Si usa utf8, por ejemplo, (no MB4), entonces varchar (255) es realmente varbinary (3 * 255). Es difícil saber cómo se desarrollarán realmente cosas como esta sin ejecutar pruebas y profundizar en el código fuente / documentación. Debido a esto, existe la posibilidad de que una longitud excesiva tenga un impacto inflado inesperadamente. esto no solo se aplica al rendimiento. Si un día necesita cambiar el conjunto de caracteres de una columna varchar a una más grande, podría terminar alcanzando algún límite sin recurso si permitió que estuvieran presentes cadenas innecesariamente largas que podrían haberse evitado. Este es normalmente un problema de nicho, pero surge,
Si resulta que MAX (LENGTH (column)) es siempre <64 (como si se decidiera que habría un límite en la entrada que no coincidía con la definición de la columna) pero tiene varchar (255), entonces hay un Es muy probable que utilice cuatro veces más espacio del necesario en algunos escenarios.
Esto puede incluir:
- Diferentes motores, algunos pueden ignorarlo por completo.
- Los tamaños de búfer, por ejemplo, actualizar o insertar, podrían tener que asignar los 255 completos (aunque no he verificado el código fuente para probar esto, es solo una hipótesis).
- Índices, esto será inmediatamente obvio si intenta hacer una clave compuesta a partir de muchas columnas varchar (255).
- Tablas intermedias y posiblemente conjuntos de resultados. Dada la forma en que funcionan las transacciones, puede que no siempre sea posible que algo utilice la longitud máxima real de las cadenas en una columna en lugar del límite definido.
- Las optimizaciones predictivas internas pueden tomar la longitud máxima como entrada.
- Cambios en las versiones de implementación de la base de datos.
Como regla general, realmente no hay necesidad de que un varchar sea más largo de lo que debe ser de todos modos, problemas de rendimiento o no, así que recomiendo seguir con eso cuando pueda. Hacer un mayor esfuerzo para muestrear el tamaño de sus datos, hacer cumplir un límite real o descubrir el límite real mediante preguntas / investigaciones es el enfoque ideal.
Cuando no pueda, si desea hacer algo como varchar (255) para los casos en los que tenga dudas, le recomiendo hacer la ciencia. Esto podría consistir en duplicar la tabla, reducir el tamaño de la columna var char, luego copiar los datos en ella desde el original y observar el tamaño de los datos de índice / fila (indexar la columna también, también probarla como clave primaria que podría comportarse de manera diferente en InnoDB ya que las filas están ordenadas por clave primaria). Como mínimo, de esta manera sabrá si tiene un impacto en IO, que tiende a ser uno de los cuellos de botella más sensibles. Probar el uso de la memoria es más difícil, es difícil probarlo de manera exhaustiva. Recomendaría probar los peores casos potenciales (consultas con muchos resultados intermedios en la memoria, verifique con la explicación para tablas temporales grandes, etc.).
Si sabe que no va a haber muchas filas en la tabla, no va a utilizar la columna para combinaciones, índices (especialmente compuestos, únicos), etc., lo más probable es que no tenga muchos problemas.
VARCHAR(255) utf8mb4
columna indexada con ~ 150.000 filas mide 11,5 MB. Una tabla con unaVARCHAR(48) utf8mb4
columna indexada con los mismos datos (longitud máxima de 46 caracteres) usó 4.5 MB. No es realmente una gran diferencia en las consultas, está indexado. Pero se suma con consultas de E / S y cosas como copias de seguridad de bases de datos.