Pregunta

Estoy optimizando algunos tablas innodb en MySQL, así que ejecuté procedimiento de análisis() para ver cuáles fueron las recomendaciones.

Los resultados recomendados texto pequeño en lugar de varchar (255) para todos los campos que se configuraron previamente como varchar(255)

Hay una ganancia de rendimiento ser obtenido mediante el uso texto diminuto?Aquí sólo me preocupa la velocidad, no el tamaño.

¿Fue útil?

Solución

No creo que si alguien te dice que TINYTEXT se almacena en otra forma, que VARCHAR.

Las diferencias reales son:

  • Los campos TINYTEXT y otro texto se almacenan por separado de la fila en memoria dentro de MySQL montón, mientras que VARCHAR () Campos añadir hasta 64k límite (para que pueda tener más de 64k en TINYTEXTs, mientras que no lo hará con VARCHAR).

  • TINYTEXT y otros campos blob-como 'obligarán capa de SQL (MySQL) para utilizar en disco tablas temporales siempre que se usen, mientras VARCHAR será aún ordenadas 'en memoria'(aunque se convertirá en CHAR para el ancho completo).

  • InnoDB internamente no le importa si se trata de TINYTEXT o varchar. Es muy fácil de verificar, crear dos tablas, una con VARCHAR (255), otro con TINYINT, e insertar un registro a la vez. Ambos tendrán una sola página 16k -. Mientras que si se utilizan páginas de desbordamiento, mesa TINYTEXT debe aparecer como tomar al menos 32k en 'SHOW TABLE STATUS

Por lo general prefieren VARCHAR (255) - no causan demasiado de la fragmentación del montón de una hilera, y puede ser tratada como un objeto único en la memoria 64k dentro de MySQL. En InnoDB diferencias de tamaño son insignificantes.

Otros consejos

Yo esperaría varchar a ser más rápido que TINYTEXT, y desde mi googlear alrededor de ese parece ser el consenso general. Por supuesto que tendría que probar su sistema para ser realmente cierto.

La razón por la que es más rápido se debe a que cuando MySQL hace ciertos tipos de operaciones (uniones, clases, etc.) que a menudo crear tablas temporales. Cuando se tiene un tipo BLOB (como TINYTEXT) en una tabla temporal de la mesa será basado en disco en lugar de basarse memoria, que por supuesto tendría un impacto en el rendimiento.

CHAR / VARCHAR va a ser más rápido ya que estas columnas se almacenan en la misma página que los datos de fila principal *, mientras que los tipos de texto se almacenan fuera de la página (que estaba equivocado, ver comentario de Harrison ).

La gente solía utilizar TINYTEXT mucho porque varchar (molesto) recortado espacios en blanco. Este comportamiento se eliminó en MySQL 5.0.

(* Al menos durante los primeros 768 bytes, y con una función de InnoDB, no el nuevo plugin InnoDB).

Es posible que también quieras considerar el uso char(255) - Si bien utiliza más espacio, ha sido sustancialmente más rápido (según mi experiencia) utilizar un campo de tamaño constante al realizar comparaciones más adelante.El espacio adicional se puede llenar con relleno si solo busca velocidad y luego ignore el espacio en blanco.

Sin embargo, tenga en cuenta:MySQL no permitirá varchar y char tipos para existir en la misma tabla.Tampoco [normalmente] permite comparaciones entre varchar y char.Descubrí esto el año pasado cuando implementé una tabla para un pasatiempo. proyecto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top