sql >> Base de Datos >  >> RDS >> Mysql

¿Deberían colocarse las columnas VARCHAR al final de las definiciones de tabla en MySQL?

Hacer esa pregunta sobre "MySQL" no es útil, ya que MySQL relega el almacenamiento a los motores de almacenamiento e implementan el almacenamiento de maneras muy diferentes. Tiene sentido hacer esta pregunta para cualquier motor de almacenamiento individual.

En el motor MEMORY, los tipos de datos de longitud variable no existen. Un VARCHAR se cambia silenciosamente a un CHAR. En el contexto de su pregunta:no importa en qué parte de la definición de una tabla coloque su VARCHAR.

En el motor MyISAM, si una tabla no tiene datos de longitud variable alguna (VARCHAR, VARBINARY o cualquier tipo TEXT o BLOB) es de la variante FIXED de MyISAM, es decir, los registros tienen una longitud fija en bytes. Esto puede tener implicaciones en el rendimiento, especialmente si los datos se eliminan y se insertan repetidamente (es decir, la tabla no se agrega solo). Tan pronto como cualquier tipo de datos de longitud variable forma parte de una definición de tabla, se convierte en la variante DINÁMICA de MyISAM, y MyISAM cambia internamente cualquier tipo CHAR excepto el más corto a VARCHAR. Nuevamente, la posición e incluso la definición de CHAR/VARCHAR no importan.

En el motor InnoDB, los datos se almacenan en páginas de 16 KB de tamaño. Una página tiene un pie de página con una suma de comprobación y un encabezado de página, entre otras cosas, un directorio de páginas. El directorio de la página contiene para cada fila el desplazamiento de esa fila en relación con el comienzo de la página. Una página también contiene espacio libre y todas las E/S se realizan en páginas.

Por lo tanto, InnoDB puede, siempre que haya espacio libre en una página, hacer crecer VARCHAR en su lugar y mover filas dentro de una página, sin incurrir en E/S adicionales. Además, dado que todas las filas se direccionan como (número de página, entrada de directorio de página), el movimiento de una fila dentro de una página se localiza en la página y no es visible desde el exterior.

También significa que para InnoDB, el orden de las columnas dentro de una fila no importa en absoluto.

Estos son los tres motores de almacenamiento que se usan más comúnmente con MySQL, y el orden de las columnas no importa para ninguno de estos tres. Puede ser que existan otros motores de almacenamiento más exóticos para los que esto no sea cierto.