2010-01-13 22 views
8

Estoy usando Django y configurando mi CharField (max_length = 255), aunque solo pretendo usar unos 5 caracteres. ¿Es esto menos eficiente? He leído que en realidad no importa con varchar, pero luego leo que ahorrará espacio en el disco duro para especificar solo lo que necesita.¿Es un varchar 2 más eficiente que un varchar 255?

Respuesta

11

En general, varchar (255) requiere tanto de almacenamiento como varchar (1). En cada caso, la tabla almacena algo así como un puntero en una tabla de cadenas y una longitud. P.ej. Desplazamiento de 4 bytes + tamaño de 1 byte = 5 bytes fijos por fila, solo para gastos generales.

El contenido real es, por supuesto, en la tabla de cadenas, que solo es tan larga como la cadena de su tienda. Por lo tanto, si almacena un nombre de 5 letras en un campo varchar (255), solo usará (por ejemplo) 5 bytes de sobrecarga + 5 bytes de contenido = 10 bytes.

El uso de un campo varchar (10) utilizará exactamente la misma cantidad, pero solo truncará cadenas de más de 10 bytes.


Por supuesto, los números específicos dependen de la implementación del motor de almacenamiento.

+0

¿La longitud toma 1 byte? Entonces, ¿tiene una limitación de 256 caracteres? ¿Cuál es su implementación SQL? Por ejemplo, Postgres almacena solo 4 bytes + cadena real. –

+0

Bueno, las versiones anteriores de MySQL (3.xy 4.x) almacenan solo 1 byte de longitud y, por lo tanto, están limitadas a 255 bytes de contenido. –

+0

MySQL 5.0.3 y posteriores pueden almacenar hasta 65.535 caracteres en un VARCHAR. –

1

espacio en el disco duro es barato, pero el espacio caché de la CPU es caro. Puede caber en campos más pequeños que campos más grandes.

+2

No creo que ocupe más espacio en memoria tampoco. Un campo más pequeño se mantiene pequeño, incluso con un largo máximo de longitud máxima. Por supuesto, si termina poniendo 200 caracteres allí, cuando una codificación más corta hubiera bastado, eso sería un desperdicio. – Thilo

0

En lugar de utilizar un espacio grande innecesariamente, utilice el espacio que no solo le proporciona más espacio de almacenamiento sino también una velocidad de ejecución más rápida ya que no necesita leer todos los caracteres. Si asigna varchar (255) y agrega texto 'abc', leerá los caracteres 'a', 'b', 'c' y otros como espacio.

lo tanto, siempre utilizar el espacio u obligados en lugar de mantener el espacio máximo.

+1

¿No es lo que está describiendo un campo CHAR (x) en lugar de un campo VARCHAR (x)? –

3

un varchar no ocupará más espacio que la cadena que almacena en el mismo, además de la overhead for storing the string length:

+------------------------------------------+---------------------------------+ 
| Value  | CHAR(4) Storage Required | VARCHAR(4) Storage Required | 
+------------+-----------------------------+---------------------------------+ 
| ''   | ' '  4 bytes   | ''   1 byte    | 
| 'ab'  | 'ab '  4 bytes   | 'ab'   3 bytes   | 
| 'abcd'  | 'abcd'  4 bytes   | 'abcd'  5 bytes   | 
| 'abcdefgh' | 'abcd'  4 bytes   | 'abcd'  5 bytes   | 
+------------+-----------------------------+---------------------------------+ 

Sin embargo, si realmente sólo requieren 5 caracteres, y luego considerar el uso de carbón de leña (5) si no hay otras columnas de ancho variable en la tabla (es decir, varchars, texto o blobs). A continuación, se le han fijado registro de longitud, lo que acarrea algunas performance advantages:

Para tablas MyISAM que cambian con frecuencia , usted debe tratar de evitar todas las columnas de longitud variable (VARCHAR, BLOB y texto). La tabla usa el formato de fila dinámica si incluye incluso una sola columna de longitud variable. Consulte Capítulo 13, Motores de almacenamiento.

2

Una advertencia sobre el uso de char en lugar de varchar es que el conjunto de caracteres afecta el espacio que debe asignarse. Por ejemplo, si el juego de caracteres para esa columna es utf8, entonces es posible que se necesiten 3 bytes para almacenar un solo carácter.

Dado que una columna char resulta en una asignación de tamaño fijo independientemente de lo que se almacena, la base de datos tiene que acomodarse en el peor de los casos. Entonces, MySQL siempre tiene que asignar 15 bytes por fila para esa columna char (5), incluso si solo almacena 5 caracteres de un solo byte en cada fila.

Un varchar usa justo lo que se necesita para cada fila tal como se almacena, por lo que esos mismos 5 caracteres de un solo byte ocupan solo 6 o 7 bytes.El byte extra o dos son para rastrear la longitud real. Para un varchar de ancho hasta 255 en un conjunto de caracteres de un solo byte, MySQL necesita asignar solo 1 byte para almacenar el ancho real. Un varchar de ancho 256 a 65.535 necesita 2 bytes para almacenar la longitud, asumiendo el conjunto de caracteres de un solo byte.

Dado que utf8 varchar (255) puede requerir 255 * 3 bytes de almacenamiento, MySQL debe asignar 2 bytes para almacenar la longitud. Gran parte de esta información se trata en los documentos de MySQL here.

Aunque puede declarar un ancho de 65.535, el tamaño máximo efectivo en bytes es 65.532. Sin embargo, dependiendo del conjunto de caracteres y los caracteres que está almacenando, puede almacenar un máximo de muchos caracteres de varios bytes más que eso.

Sin embargo, como señala Paul, es posible que desee utilizar un carácter si eso permitiría que toda la fila se fije en ancho. Entre otras cosas, ciertas búsquedas pueden ser más rápidas (por ejemplo, omitir las primeras 1000 filas) debido a la compensación fija.

También hay problemas de rendimiento a tener en cuenta en las actualizaciones de la columna. Si tiene un char (5) y comienza con 1 carácter y luego actualiza el valor a 5 caracteres, la fila se puede actualizar en su lugar. Con un varchar, dependiendo de la implementación del motor de almacenamiento, puede ser necesario reescribir toda la fila en una nueva ubicación.

Finalmente, si MySQL necesita crear una tabla temporal en memoria para ordenar un conjunto de resultados de su tabla persistente, usa registros de longitud fija. Por lo tanto, asigna mucho más espacio en la memoria para esas columnas varchar de gran tamaño de lo que podría haber pensado. Esto está cubierto en los documentos de MySQL para las tablas del motor de almacenamiento de memoria. Creo que MySQL también hace esto para géneros basados ​​en disco.

Cuestiones relacionadas