Después de la versión 5.0.3 (que permitió que VARCHAR tuviera 65.535 bytes y dejó de truncar los espacios finales), ¿hay alguna diferencia importante entre estos dos tipos de datos?
Estaba leyendo la lista de diferencias y las dos únicas notables son:
Para los índices en las columnas BLOB y TEXT, debe especificar una longitud de prefijo de índice. Para CHAR y VARCHAR, una longitud de prefijo es opcional. Consulte la Sección 7.5.1, “Índices de columna”.
y
Las columnas BLOB y TEXT no pueden tener valores POR DEFECTO.
Entonces, debido a estas dos limitaciones en el tipo de datos TEXT, ¿por qué lo usarías sobre varchar (65535)? ¿Hay ramificaciones de rendimiento de uno sobre el otro?
mysql
database-design
datatypes
Derek Downey
fuente
fuente
Respuestas:
dividido vinculado a alguna información que explica el problema básico (hay diferencias de rendimiento), pero no es lo suficientemente simple como para decir que uno siempre es mejor que el otro. (de lo contrario, no habría razón para tener ambos). Además, en MyISM, el tamaño máximo de 64k para VARCHAR no es por campo, es por registro.
Básicamente, hay 4 formas de almacenar cadenas en registros de bases de datos:
MyISM usa algo similar al # 3 para VARCHAR, y un enfoque híbrido para TEXT donde almacena el comienzo de la cadena en el registro, luego el resto de la cadena en otro lugar. InnoDB es similar para VARCHAR, pero almacena el campo TEXTO completo fuera del registro.
Con 1 y 4, las cosas en el registro siempre tienen la misma longitud, por lo que es más fácil saltar si no necesita la cadena, pero necesita cosas después. Tanto el n. ° 2 como el n. ° 3 no son tan malos para las cadenas cortas ... El n. ° 2 tiene que seguir buscando el marcador, mientras que el n. ° 3 puede saltar ... a medida que las cuerdas se alargan, el n. ° 2 empeora para este uso en particular caso.
Si realmente necesita leer la cadena, # 4 es más lento, ya que tiene que leer el registro, luego lea la cadena que podría estar almacenada en otro lugar del disco, dependiendo de cómo lo maneje esa base de datos. El n. ° 1 siempre es bastante sencillo, y de nuevo te encuentras con problemas similares en los que para el n. ° 2 empeora cuanto más larga es la cadena, mientras que el n. ° 3 es un poco peor que el n. ° 2 para cadenas muy pequeñas, pero mejor a medida que se alarga.
Luego están los requisitos de almacenamiento ... # 1 siempre es una longitud fija, por lo que podría tener hinchazón si la mayoría de las cadenas no tienen la longitud máxima. # 2 tiene 1 byte extra; # 3 normalmente tiene 2 bytes adicionales si la longitud máxima = 255, 4 bytes adicionales si un máximo de 64k. # 4 tiene la longitud del puntero, más las reglas para el # 3 típicamente.
Para las implementaciones específicas dentro de MySQL 5.1, los documentos para MyISM indican :
Mientras que para InnoDB :
...
Al igual que con muchas otras cosas cuando se trata de bases de datos, si no está seguro de lo que es mejor para sus necesidades, intente compararlo con datos y uso similares, y vea cómo se comportan.
fuente
LONGTEXT
yLONGBLOB
son un ejemplo de ello. MySQL no utiliza cadenas de estilo C (que yo sepa). InnoDB utiliza un enfoque 'híbrido', pero es más complejo, dependiendo del tamaño de la fila, el formato de fila, etc. El almacenamiento de cadenas en una longitud "fija" casi nunca es aconsejable, excepto cuando en realidad tienen una longitud constante (código_país, código postal, etc.) . InnoDB tiene 4ROW_FORMATs
; el texto discute solo 1 o 2 de ellos.Cuando un SELECT necesita crear una tabla temporal (como ordenar los resultados), creará una tabla MEMORY o una tabla MyISAM. La memoria es más eficiente. Hay restricciones en MEMORY: una es no permitir TEXT y BLOB. Por lo tanto, un SELECT puede ejecutarse más lentamente con TEXTO que VARCHAR.
fuente