Pregunta

MySQL especifica el formato de fila de una tabla como fijo o dinámico, dependiendo de los tipos de datos de la columna. Si una tabla tiene un tipo de datos de columna de longitud variable, como TEXT o VARCHAR, el formato de fila es dinámico; de lo contrario, está arreglado.

Mi pregunta es, ¿cuál es la diferencia entre los dos formatos de fila? ¿Es uno más eficiente que el otro?

¿Fue útil?

Solución

La diferencia realmente solo importa para MyISAM, a otros motores de almacenamiento no les importa la diferencia. EDITAR: Muchos usuarios comentaron que a InnoDB le importa: enlace 1 a vapor , enlace 2 por Kaan .

Con MyISAM con filas de ancho fijo, hay algunas ventajas:

  1. Sin fragmentación de fila: es posible con filas de ancho variable obtener filas individuales divididas en varias secciones en el archivo de datos. Esto puede aumentar las búsquedas de disco y ralentizar las operaciones. Es posible desfragmentarlo con OPTIMIZE TABLE, pero esto no siempre es práctico.

  2. Tamaño del puntero del archivo de datos: en MyISAM, existe un concepto de puntero del archivo de datos que se utiliza cuando necesita hacer referencia al archivo de datos. Por ejemplo, esto se usa en índices cuando se refieren a dónde está realmente la fila. Con tamaños de ancho fijo, este puntero se basa en el desplazamiento de fila en el archivo (es decir, las filas son 1, 2, 3 independientemente de su tamaño). Con el ancho variable, el puntero se basa en el desplazamiento de bytes (es decir, las filas pueden ser 1, 57, 163). El resultado es que con tablas grandes, el puntero debe ser más grande, lo que agrega potencialmente más sobrecarga a la tabla.

  3. Más fácil de solucionar en caso de corrupción. Dado que cada fila es del mismo tamaño, si su tabla MyISAM se corrompe, es mucho más fácil de reparar, por lo que solo perderá los datos que realmente estén dañados. Con ancho variable, en teoría es posible que los punteros de ancho variable se confundan, lo que puede dar lugar a una mala conexión de los datos.

Ahora el principal inconveniente del ancho fijo es que desperdicia más espacio. Por ejemplo, necesita usar campos CHAR en lugar de campos VARCHAR, por lo que terminará con espacio extra ocupado.

Normalmente, no tendrá muchas opciones en el formato, ya que se dicta en función del esquema. Sin embargo, podría valer la pena si solo tiene unos cuantos varchar o un solo blob / texto para intentar optimizarlo. Por ejemplo, considere cambiar la única varchar a un char, o divida el blob en su propia tabla.

Puedes leer aún más sobre esto en:

http://dev.mysql.com/doc/ refman / 5.0 / es / static-format.html

http://dev.mysql.com/doc/ refman / 5.0 / es / dynamic-format.html

Otros consejos

Una diferencia clave ocurre cuando actualiza un registro. Si el formato de fila es fijo, no hay ningún cambio en la longitud del registro. Por el contrario, si el formato de la fila es dinámico y los nuevos datos hacen que el registro aumente en longitud, se usa un enlace para apuntar al " desbordamiento " datos (es decir, se llama puntero de desbordamiento).

Esto fragmenta la tabla y generalmente ralentiza las cosas. Hay un comando para desfragmentar (OPTIMIZE TABLE), que mitiga un poco el problema.

Esta página en la documentación de MySQL parece contradecir la respuesta principal aquí, ya que el formato de fila DYNAMIC también significa algo para las tablas InnoDB:

http://dev.mysql.com/doc/innodb /1.1/en/innodb-row-format-dynamic.html

Fijo significa que cada fila es exactamente del mismo tamaño. Eso significa que si la tercera fila de una página de datos necesita cargarse, será exactamente en PageHeader + 2 * RowSize, ahorrando algo de tiempo de acceso.

Para encontrar el comienzo de un registro dinámico, se debe consultar la lista de compensaciones de registros, lo que implica una indirección adicional.

En resumen, sí, hay un ligero impacto en el rendimiento para las filas dinámicas. No, no es muy grande. Si crees que será un problema, pruébalo.

Fijo debería ser más rápido y más seguro que dinámico, con el inconveniente de tener una longitud de carácter fija. Puede encontrar esta información aquí: http: //dev.mysql .com / doc / refman / 5.0 / es / static-format.html

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