El motor de almacenamiento InnoDB admite cuatro formatos de fila diferentes:

En MariaDB 10.1 y antes, los dos últimos formatos de fila solo son compatibles si el formato de archivo InnoDB es Barracuda. por lo tanto, el innodb_file_format la variable del sistema debe establecerse en Barracuda para utilizar estos formatos de fila en esas versiones.

En MariaDB 10.1 y antes, los dos últimos formatos de fila también solo son compatibles si la tabla está en un espacio de tabla de archivo por tabla. por lo tanto, el innodb_file_per_table la variable del sistema debe establecerse en ON para utilizar estos formatos de fila en esas versiones.

Formato de fila predeterminado

MariaDB comenzando con 10.2.2

En MariaDB 10.2.2 y luego, el innodb_default_row_format La variable de sistema se puede utilizar para establecer el formato de fila predeterminado para las tablas InnoDB. Los posibles valores son:

  • redundant
  • compact
  • dynamic

El valor predeterminado de esta variable del sistema es dynamic, lo que significa que el formato de fila predeterminado es DYNAMIC.

Esta variable del sistema no se puede establecer en compressed, lo que significa que el formato de fila predeterminado no se puede COMPRESSED.

Por ejemplo, las siguientes declaraciones crearían una tabla con el DYNAMIC formato de fila:

SETSESSION innodb_strict_mode=ON;SETGLOBAL innodb_default_row_format='dynamic';CREATETABLE tab (
   id int,
   str varchar(50))ENGINE=InnoDB;

MariaDB hasta 10.2.1

En MariaDB 10.2.1 y antes, el formato de fila predeterminado es COMPACT.

Por ejemplo, las siguientes declaraciones crearían una tabla con el COMPACT formato de fila:

SETSESSION innodb_strict_mode=ON;CREATETABLE tab (
   id int,
   str varchar(50))ENGINE=InnoDB;

Establecer el formato de fila de una tabla

Una forma de especificar el formato de fila de una tabla InnoDB es estableciendo el ROW_FORMAT opción de tabla al formato de fila relevante en una CREATE TABLE o ALTER TABLE declaración. Por ejemplo:

SETSESSION innodb_strict_mode=ON;SETGLOBAL innodb_file_per_table=ON;SETGLOBAL innodb_file_format='Barracuda';CREATETABLE tab (
   id int,
   str varchar(50))ENGINE=InnoDB ROW_FORMAT=DYNAMIC;

En MariaDB 10.1 y antes, InnoDB puede ignorar y anular silenciosamente algunas opciones de formato de fila si no tiene la innodb_file_format variable del sistema establecida en Barracuda y el innodb_file_per_table variable del sistema establecida en ON.

Comprobación del formato de fila de una tabla

los SHOW TABLE STATUS La declaración se puede utilizar para ver el formato de fila utilizado por una tabla. Por ejemplo:

SHOWTABLESTATUSFROM db1 WHERE Name='tab'G
***************************1.row***************************
           Name: tab
         Engine: InnoDB
        Version: 10
     Row_format: Dynamic
           Rows: 0
 Avg_row_length: 0
    Data_length: 16384
Max_data_length: 0
   Index_length: 0
      Data_free: 0Auto_increment: NULL
    Create_time: 2019-04-1820:24:04
    Update_time: NULL
     Check_time: NULL
      Collation: latin1_swedish_ci
       Checksum: NULL
 Create_options: row_format=DYNAMIC
        Comment:

En MariaDB 10.0 y posterior, el information_schema.INNODB_SYS_TABLES También se puede consultar la tabla para ver el formato de fila utilizado por una tabla. Por ejemplo:

SELECT*FROM information_schema.INNODB_SYS_TABLES WHERE name='db1/tab'G
***************************1.row***************************
     TABLE_ID: 42
         NAME: db1/tab
         FLAG: 33
       N_COLS: 4
        SPACE: 27
  FILE_FORMAT: Barracuda
   ROW_FORMAT: Dynamic
ZIP_PAGE_SIZE: 0
   SPACE_TYPE: Single

El espacio de tabla de una tabla está etiquetado con el formato de archivo InnoDB más bajo que admite el formato de fila de la tabla. Entonces, incluso si el Barracuda El formato de archivo está habilitado, las tablas que utilizan el COMPACT o REDUNDANT Los formatos de fila se etiquetarán con el Antelope formato de archivo en el information_schema.INNODB_SYS_TABLES mesa.

Formatos de fila

REDUNDANT Formato de fila

los REDUNDANT El formato de fila es el formato de fila original no compactado.

los REDUNDANT El formato de fila era el único formato de fila disponible antes de MySQL 5.0.3. En esa versión, este formato de fila se denominó retroactivamente el REDUNDANT formato de fila. En la misma versión, el COMPACT El formato de fila se introdujo como el nuevo formato de fila predeterminado.

Consulte Formato de fila REDUNDANTE de InnoDB para obtener más información.

COMPACT Formato de fila

MariaDB hasta 10.2.1

En MariaDB 10.2.1 y antes, el formato de fila predeterminado es COMPACT.

los COMPACT El formato de fila es similar al REDUNDANT formato de fila, pero almacena datos de una manera más compacta que requiere aproximadamente un 20% menos de almacenamiento.

Este formato de fila se introdujo originalmente en MySQL 5.0.3.

Consulte Formato de fila COMPACT de InnoDB para obtener más información.

DYNAMIC Formato de fila

MariaDB comenzando con 10.2.2

En MariaDB 10.2.2 y luego, el formato de fila predeterminado es DYNAMIC.

los DYNAMIC El formato de fila es similar al COMPACT formato de fila, pero las tablas que utilizan el DYNAMIC El formato de fila puede almacenar incluso más datos en páginas de desbordamiento que las tablas que utilizan el COMPACT formato de fila. Esto da como resultado un almacenamiento de datos más eficiente que las tablas que utilizan el COMPACT formato de fila, especialmente para tablas que contienen columnas que utilizan el VARBINARY, VARCHAR, BLOB y TEXT tipos de datos. Sin embargo, las tablas InnoDB que utilizan el COMPRESSED el formato de fila es más eficiente.

los DYNAMIC El formato de fila se introdujo originalmente en MySQL 5.5 y MariaDB 5.5.

Consulte Formato de fila DINÁMICO InnoDB para obtener más información.

COMPRESSED Formato de fila

MariaDB comenzando con 10.1

En MariaDB 10.1 y versiones posteriores, una forma alternativa de comprimir tablas InnoDB es mediante la compresión de página InnoDB.

los COMPRESSED El formato de fila es similar al COMPACT formato de fila, pero las tablas que utilizan el COMPRESSED El formato de fila puede almacenar incluso más datos en páginas de desbordamiento que las tablas que utilizan el COMPACT formato de fila. Esto da como resultado un almacenamiento de datos más eficiente que las tablas que utilizan el COMPACT formato de fila, especialmente para tablas que contienen columnas que utilizan el VARBINARY, VARCHAR, BLOB y TEXT tipos de datos.

los COMPRESSED El formato de fila también admite la compresión de todos los datos y las páginas de índice.

los COMPRESSED El formato de fila se introdujo originalmente en MySQL 5.5 y MariaDB 5.5.

Consulte Formato de fila COMPRIMIDO de InnoDB para obtener más información.

Tamaño máximo de fila

Varios factores ayudan a determinar el tamaño máximo de fila de una tabla InnoDB.

Primero, MariaDB impone un límite de 65,535 bytes en el tamaño máximo de fila de una tabla. El tamaño total de una mesa BLOB y TEXT las columnas no cuentan para este límite. Solo los punteros para una mesa BLOB y TEXT las columnas cuentan para este límite. MariaDB aplica este límite para todos los motores de almacenamiento, por lo que este límite también se aplica a las tablas InnoDB. Por lo tanto, este límite es el tamaño de fila máximo absoluto para una tabla InnoDB.

Si intenta crear una tabla que excede el límite global de MariaDB en el tamaño máximo de fila de una tabla, verá un error como este:

ERROR 1118(42000): Row size too large. The maximum row size for the used tabletype,not counting BLOBs,is65535. This includes storage overhead,check the manual. You 
have to change somecolumnstoTEXTor BLOBs

Sin embargo, InnoDB también tiene sus propios límites en el tamaño máximo de fila, por lo que el tamaño máximo de fila de una tabla InnoDB podría ser menor que el límite global de MariaDB.

En segundo lugar, la cantidad máxima de datos que una tabla InnoDB puede almacenar en la página principal de datos de una fila depende del valor de la innodb_page_size variable de sistema. A lo sumo, los datos que una sola fila puede consumir en la página de datos principal de la fila es la mitad del valor del innodb_page_size variable de sistema. Con el valor predeterminado de 16k, eso significaría que una sola fila puede consumir como máximo alrededor de 8 KB en la página de datos principal de la fila. Sin embargo, el límite en la página de datos principal de la fila no es el límite absoluto en el tamaño de la fila.

En tercer lugar, todos los formatos de fila de InnoDB pueden almacenar ciertos tipos de datos en páginas de desbordamiento, por lo que el tamaño máximo de fila de una tabla InnoDB puede ser mayor que la cantidad máxima de datos que se pueden almacenar en la página de datos principal de la fila.

Algunos formatos de fila pueden almacenar más datos en páginas de desbordamiento que otros. Por ejemplo, el DYNAMIC y COMPRESSED Los formatos de fila pueden almacenar la mayoría de los datos en páginas de desbordamiento. Para ver cómo determinar cómo los distintos formatos de fila de InnoDB pueden usar páginas de desbordamiento, consulte las siguientes secciones:

  • Formato de fila REDUNDANTE de InnoDB: páginas de desbordamiento con el formato de fila REDUNDANTE
  • Formato de fila COMPACT InnoDB: páginas de desbordamiento con el formato de fila COMPACT
  • Formato de fila DINÁMICO de InnoDB: páginas de desbordamiento con el formato de fila DINÁMICO
  • Formato de fila COMPRIMIDO de InnoDB: páginas de desbordamiento con el formato de fila COMPRIMIDO

Si la definición de una tabla puede permitir filas que el formato de fila InnoDB de la tabla en realidad no puede almacenar, InnoDB generará errores o advertencias en ciertos escenarios.

Si la mesa estuviera usando el REDUNDANT o COMPACT formatos de fila, entonces el error o advertencia sería el siguiente:

ERROR 1118(42000): Row size too large (>8126). Changing somecolumnstoTEXTorBLOBorusing ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED 
may help.Incurrentrow format,BLOB prefix of768 bytes is stored inline.

Y si la mesa estuviera usando el DYNAMIC o COMPRESSED formatos de fila, entonces el error o advertencia sería el siguiente:

ERROR 1118(42000): Row size too large (>8126). Changing somecolumnstoTEXTorBLOB may help.Incurrentrow format,BLOB prefix of0 bytes is stored inline.

Estos mensajes se generan en los siguientes casos:

  • Si el modo estricto InnoDB es activado y si se ejecuta una declaración DDL que toca la mesa, como CREATE TABLE o ALTER TABLE, entonces InnoDB generará una error con este mensaje
  • Si el modo estricto InnoDB es discapacitado y si se ejecuta una declaración DDL que toca la mesa, como CREATE TABLE o ALTER TABLE, entonces InnoDB generará una advertencia con este mensaje.
  • Independientemente de si el modo estricto InnoDB está habilitado, si se ejecuta una instrucción DML que intenta escribir una fila que el formato de fila InnoDB de la tabla no puede almacenar, InnoDB generará una error con este mensaje.

Para obtener información sobre cómo resolver el problema, consulte Solución de problemas de errores de tamaño de fila demasiado grande con InnoDB.

Problemas conocidos

La actualización provoca errores de tamaño de fila demasiado grandes

Antes de MariaDB 10.2.26, MariaDB 10.3.17, y MariaDB 10.4.7, MariaDB no calcula correctamente el tamaño de las filas al ejecutar DDL. En estas versiones, inseguro Se pueden crear tablas, incluso si el modo estricto InnoDB está habilitado. Los cálculos fueron fijados por MDEV-19292 en MariaDB 10.2.26, MariaDB 10.3.17, y MariaDB 10.4.7. Como efecto secundario, algunas tablas que podrían crearse o modificarse en versiones anteriores pueden ser rechazadas con el siguiente error en estas versiones y versiones posteriores.

ERROR 1118(42000): Row size too large (>8126). Changing somecolumnstoTEXTorBLOB may help.Incurrentrow format,BLOB prefix of0 bytes is stored inline.

InnoDB utilizó los cálculos incorrectos para determinar el tamaño de las filas durante bastante tiempo, por lo que muchos usuarios pueden, sin saberlo, tener inseguro tablas que el formato de fila InnoDB en realidad no puede almacenar.

InnoDB actualmente no tiene una manera fácil de verificar qué tablas existentes tienen este problema. Ver MDEV-20400 para más información.

Para obtener información sobre cómo resolver el problema, consulte Solución de problemas de errores de tamaño de fila demasiado grande con InnoDB.

El contenido reproducido en este sitio es propiedad de sus respectivos dueños, y MariaDB no revisa este contenido con anticipación. Los puntos de vista, la información y las opiniones expresadas por este contenido no representan necesariamente las de MariaDB o de cualquier otra parte.