[Notas de estudio de MySQL (4)] Introducción al formato de cuatro filas de InnoDB, columna de desbordamiento

¡Este artículo es publicado por la cuenta oficial [Developing Pigeon]! ¡Bienvenido a seguir! ! !


Old Rules-Sister Town House:

Uno. Página InnoDB

(1) Resumen de la página

       InnoDB es un motor de almacenamiento que almacena los datos en la tabla en el disco. El proceso de procesamiento real de los datos tiene lugar en la memoria. Los datos en el disco deben cargarse en la memoria. Si se procesa la solicitud de escritura o modificación , también necesita ser almacenado en la memoria Vacíe el contenido en el disco. InnoDB divide los datos en varios elementos, utilizando las páginas como unidad básica de interacción entre el disco y la memoria. El tamaño de la página es generalmente de 16 KB o 16384 bytes, que se pueden especificar al inicializar el directorio de datos MySQL y no se pueden modificar posteriormente.

(Dos) formato de fila InnoDB

1. Información general

       Inserte datos en la tabla en unidades de registro La forma de almacenamiento de estos registros en el disco se llama formato de fila. Hay 4 formatos de línea chinos en InnoDB, COMPACT, REDUNDANT, DYNAMIC, COMPRESSED. Puede especificar el formato de fila utilizado por el registro en la declaración que crea o modifica la tabla:

CREATE TABLE 表名(列的信息) ROW_FORMAT=行格式;
ALTER TABLE 表名 ROW_FORMAT=行格式;

2. Formato de fila COMPACTO

       Un registro completo se divide en dos partes: la información adicional registrada y los datos reales registrados.

(1) Información adicional registrada

       Esta parte de la información es información adicional que se agrega para administrar mejor los registros. Se divide en tres partes, una lista de longitud de campo de longitud variable, una lista de valores NULL e información de encabezado de registro.

1) Lista de longitud de campo de longitud variable

       MySQL admite algunos tipos de datos de longitud variable, como VARCHAR, VARBINARY, TEXT, etc. El número de bytes de datos que se pueden almacenar en un campo de longitud variable no es fijo, por lo que mientras se almacenan datos reales, también es necesario almacenar el número de bytes ocupados por estos datos. El número de bytes ocupados por todos los campos de longitud variable se almacena en la lista de longitud de campo de longitud variable en el orden inverso de la secuencia de columnas. Si el conjunto de caracteres utilizado por el campo de longitud variable requiere como máximo W bytes para representar un carácter, y el campo de longitud variable está configurado para almacenar hasta M caracteres durante la inicialización, entonces el número máximo de bytes ocupados por la longitud variable El campo es W x M, si W x M <255, entonces use 1 byte para representar el número de bytes ocupados por los datos reales; si W x M> 255 y el número de bytes reales L <= 127, entonces use 1 byte , de lo contrario, se utilizan dos bytes.

       Tenga en cuenta que la lista de longitud de campo de longitud variable solo almacena la longitud del contenido de la columna cuyo valor no es NULL.

2) Lista de valores NULL

       Para ahorrar espacio de almacenamiento de valores NULL, las columnas con valores NULL en un registro se administran de manera unificada y se almacenan en la lista de valores NULL.

       Primero, cuente las columnas que pueden almacenar NULL en la tabla de estadísticas. La columna de clave primaria y la columna modificada con NOT NULL no pueden almacenar valores NULL. Si no hay una columna que permita almacenar NULL en la tabla, entonces la lista de valores NULL no existirá. De lo contrario, cada columna que permite almacenar NULL corresponde a un bit binario, y el bit binario se organiza en orden inverso. de la columna. Cuando un bit binario es 1, significa que el valor de la columna es NULL; de lo contrario, no es NULL. MySQL estipula que la lista de valores NULL debe estar representada por un número entero de bytes. Si el número de bits binarios usados ​​no es un número entero de bytes, los bits altos del byte deben llenarse con 0.

3) Registrar la información del encabezado

       La información del encabezado del registro consta de 5 bytes fijos, que se utilizan para describir algunos atributos del registro. Consulte el libro para conocer los conceptos específicos.

(2) Los datos reales registrados

       Además de los datos en las columnas definidas por usted mismo, los datos reales del registro también agregarán algunas columnas ocultas por defecto para cada registro. La clave principal definida por el usuario se utiliza preferentemente como clave principal en la tabla InnoDB. Si la clave principal no está definida, se selecciona una clave ÚNICA que no puede almacenar valores NULL como clave principal. Si no hay ninguna tal clave, InnoDB agregará una columna oculta de row_id como la clave primaria predeterminada. trx_id es una columna de ID de transacción oculta y roll_pointer es una columna de puntero de reversión oculta.

       La columna de longitud fija almacena solo valores pequeños inmediatamente y también ocupa un número fijo de bytes. El valor NULL se almacena directamente en la lista de valores NULL anterior, y los datos reales del registro no se almacenarán de forma redundante, lo que ahorra almacenamiento espacio.


(3) Formato de almacenamiento CHAR (M)

       CHAR (M) representa un campo de longitud fija. Si el campo usa un conjunto de caracteres codificados de longitud fija, como ascii, su longitud no se almacenará en la lista de longitud de campo de longitud variable; si el campo usa una longitud variable code Juego de caracteres, como utf8, gbk, su longitud también se almacenará en la lista de longitud de campo de longitud variable.

       La columna de tipo CHAR (M) que utiliza el juego de caracteres codificados de longitud variable requiere al menos M bytes, mientras que VARCHAR (M) no tiene este requisito, como el juego de caracteres utf8. Para CHAR (10), la palabra ocupada por los datos almacenados en la columna La longitud de la sección es de 10 a 30 bytes, porque hay como máximo 10 caracteres y un carácter ocupa 1-3 bytes. Este diseño se puede actualizar directamente cuando se actualiza el registro, sin reasignar espacio debido a un espacio de almacenamiento insuficiente, lo que da como resultado el espacio de registro original llamado fragmentación.


3. Formato de línea REDUNDANTE

       Un formato de línea relativamente antiguo.

(1) Lista de compensación de longitud de campo

       La información de longitud de todas las columnas (incluidas las columnas ocultas) del registro se almacena en la lista de desplazamiento de longitud de campo en orden inverso, y la diferencia entre dos desplazamientos adyacentes se utiliza para calcular la longitud de cada valor de columna.


(2) El número de bytes del desplazamiento

       El desplazamiento correspondiente a cada columna se almacena en 1 byte o 2 bytes, que se juzga en función de si el número de bytes ocupados por los datos reales registrados es mayor que 127 o menor que 127. Siempre que la longitud de bytes ocupada por los datos reales de todo el registro sea mayor de 127, incluso si el espacio de almacenamiento ocupado por el valor de una determinada columna no es mayor de 127 bytes, se deben usar dos bytes para representar el desplazamiento de la columna. Este es un método obsoleto y desperdicia espacio.

(3) Manejo de valores NULL

       No hay una lista de valores NULL en el formato de fila REDUNDANTE, por lo que el primer bit del valor de compensación correspondiente a la columna se utiliza como base para determinar si es NULL. Este bit se denomina bit NULL.

       Si el campo que almacena el valor NULL es de tipo de longitud fija, el valor NULL ocupará la parte de datos reales del registro y los datos correspondientes al campo se llenarán con 0x00 bytes; si es un tipo de datos de longitud variable , los datos reales del registro no serán espacio ocupado.

4. Columna de desbordamiento

       En los formatos de fila COMPACT y REDUNDANT, los registros se asignarán a una página para su almacenamiento. Si el tamaño del registro excede el tamaño de la página, solo una parte de los datos de la columna se almacenarán en los datos reales del registro, y el los datos restantes se dispersarán En varias otras páginas, se utilizan 20 bytes para almacenar las direcciones que apuntan a estas páginas en los datos reales del registro.

       Si hay muchos datos en una columna, solo los primeros 768 bytes de datos de la columna y una dirección que apunta a otras páginas se almacenarán en los datos reales del registro. Las otras páginas se denominan páginas de desbordamiento y esta columna se llama columnas de desbordamiento.

5. Punto crítico de la página de desbordamiento

       ¿Cuántos bytes almacena una columna antes de convertirse en una columna de desbordamiento?

       MySQL estipula que al menos dos filas de registros se almacenan en una página. Además de almacenar nuestra información, cada página también tiene información adicional. En total, requiere 132 bytes de espacio. La información adicional requerida para cada registro es de 27 bytes. Supongamos que uno El número de bytes ocupados por los datos reales de una columna es n. Si la columna no se desborda, se debe satisfacer la siguiente desigualdad:

132 + 2 x (27 + n) < 16384

即 n < 8099

6. Formato de línea DINÁMICO

       Cuando se desborda, los primeros 768 bytes de la columna no se almacenarán, pero todos los bytes se almacenarán en la página de desbordamiento.

7. Formato de fila COMPRIMIDO

       Utilice un algoritmo de compresión para comprimir páginas y ahorrar espacio.

       Solo el formato de fila REDUNDANTE no es compacto y está obsoleto, y los otros son formatos de fila más nuevos y son compactos.

Supongo que te gusta

Origin blog.csdn.net/Mrwxxxx/article/details/113795981
Recomendado
Clasificación