2008-09-29 16 views
44

MySQL especifica el formato de fila de una tabla como fija o dinámica, dependiendo de los tipos de datos de columna. Si una tabla tiene un tipo de datos de columna de longitud variable, como TEXT o VARCHAR, el formato de la fila es dinámico; de lo contrario, es fijo.Formato de fila MySQL: ¿diferencia entre fijo y dinámico?

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

Respuesta

54

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: link 1 by steampowered, link 2 by Kaan.

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

  1. ninguna fila fragmentación: Es posible con filas de ancho variable para obtener filas individuales divididos en varias secciones a través del archivo de datos. Esto puede aumentar la búsqueda de discos 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 un puntero de archivo de datos que se usa 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 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 mucho más sobrecarga a la tabla.

  3. Más fácil de arreglar en caso de corrupción. Como cada fila tiene el 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 estén realmente dañados. Con un ancho variable, en teoría es posible que los punteros de ancho variable se arruinen, lo que puede dar como resultado que los datos de la manguera sean malos.

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

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 tienes unos pocos varchar o un solo blob/texto para tratar de optimizarlo. Por ejemplo, considere cambiar el único varchar en un char, o divida el blob en su propia tabla.

Usted puede leer más sobre esto en:

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

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

+9

[Esta página] (http://dev.mysql.com/doc/innodb/1.1/en/innodb-row-format-dynamic.html) indica que el formato de fila dinámica también tiene significado para InnoDB. – steampowered

+4

Otro artículo que indica el formato de fila dinámica tiene importancia para InnoDB: [Blob Storage en InnoDB - MySQL Performance Blog] (http://www.mysqlperformanceblog.com/2010/02/09/blob-storage-in-innodb/) – Kaan

+1

I probé la inserción de 10 mil registros en una tabla con 'ROW_SIZE = 282B '. Con InnoDB, tomó casi 500 segundos, con MyISAM y MEMORY, tomó aproximadamente 2.97 segundos. – Victor

4

Fijo significa que cada fila tiene exactamente el mismo tamaño. Eso significa que si la 3ra fila en una página de datos necesita ser cargada, estará en exactamente PageHeader + 2 * RowSize, ahorrando algo de tiempo de acceso.

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

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

+2

¿El párrafo del medio es verdadero? Parece contradecir la respuesta aceptada. (es decir: el tamaño del puntero es meramente más grande, no un nivel extra de indirección) –

10

Se produce una diferencia clave al actualizar un registro. Si el formato de fila es fijo, no hay cambio en la longitud del registro. Por el contrario, si el formato de fila es dinámico y los nuevos datos hacen que el registro aumente de longitud, se usa un enlace para señalar los datos de "desbordamiento" (es decir, se llama puntero de desbordamiento).

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

Cuestiones relacionadas