una - Formato de fila MySQL: ¿diferencia entre fijo y dinámico?
obtener datos mysql php (5)
Esta página en la documentación de MySQL parece contradecir la respuesta principal aquí, en ese formato de filas DYNAMIC también significa algo para las tablas InnoDB:
http://dev.mysql.com/doc/innodb/1.1/en/innodb-row-format-dynamic.html
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.
Mi pregunta es, ¿cuál es la diferencia entre los dos formatos de fila? ¿Es uno más eficiente que el otro?
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 pequeño golpe de rendimiento para las filas dinámicas. No, no es muy grande. Si crees que será un problema, pruébalo.
Fixed debería ser más rápido y más seguro que dinámico, con el inconveniente de tener una longitud de onda fija. Puede encontrar esta información aquí: http://dev.mysql.com/doc/refman/5.0/en/static-format.html
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 por steampowered , enlace 2 por Kaan .
Con MyISAM con filas de ancho fijo, hay algunas ventajas:
Sin fragmentación de fila: es posible con filas de anchura variable obtener filas individuales divididas en varias secciones en el 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.
Tamaño del puntero del archivo de datos: en MyISAM, hay 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.
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.
Puedes leer más sobre esto en:
Se produce una diferencia clave cuando actualiza 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 en 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.