Formato de fila compacto mysql

 

 

 

 

 

Tipo de formato de fila InnoDB (formato compacto)

Diagrama esquemático del formato de fila compacto:

 

 

 

 

Cómo almacenar campos de longitud variable en Mysql

 

MySQL admite tipos de datos de longitud variable, varchar (m), varbinary (m), texto, tipos de blob, etc. El espacio de almacenamiento ocupado por estos tipos de datos de longitud variable se divide en dos partes:

   1. El contenido de datos reales

   2. Declare el número de bytes ocupados

Si no se guarda la cantidad de bytes ocupados por los datos reales, el servidor mysql no puede determinar cuánto tiempo son los datos reales, lo que resulta en la incapacidad de obtener los datos con precisión. Entonces, cuando almacenamos datos reales, necesitamos almacenar la cantidad de bytes ocupados por estos datos por cierto.

En el formato de fila compacto, la longitud de todos los tipos de longitud de lado se almacena al principio del registro de fila para formar una lista, que se almacena en el orden inverso de la columna .

CHAR es un tipo de longitud fija, VARCHAR es un tipo de longitud variable VARCHAR (M) y M representa el número máximo de caracteres que se pueden almacenar. (MySQL5.0.3 solía ser bytes antes y luego son caracteres)

 

Método de almacenamiento básico

变长字段的长度列表,null值列表,数据头,column01的值,column02的值,column0n的值...
  •  

Cómo almacenar campos de longitud variable

  • Hay un campo de longitud variable en una fila.
    # 假如有三个字段 id,name,age其中name是变长类型(Varchar)
    |id|name|age|
    |1|wang|18|
    
    磁盘里的存储为:
    0x04 null值列表 数据头 1 wang 18
    
    # 其中0x04表示name长度为4
  • También se almacenan varias filas de datos una al lado de la otra
    # 假如有三个字段 id,name,age其中name是变长类型(Varchar)
    |id|name|age|
    |1|wang|18|
    |2|li|20|
    
    磁盘里的存储为:
    0x04 null值列表 数据头 1 wang 18 0x02 null值列表 数据头 2 li 20
  • Cómo almacenar varios campos de longitud variable en una sola fila
    # 假如有三个字段 id,name,desc,age其中name,desc是变长类型(Varchar)
    |id|name|desc|age|
    |1|wang|shuaige|18|
    
    磁盘里的存储为:
    0x07 0x04 null值列表 数据头 1 wang shuaige 18
    
    # 其中0x04表示name长度为4,0x07表示desc的长度为7

 

 

 

 

Cómo se almacena la lista de valores NULL

El formato de fila Compacto administrará uniformemente las columnas que pueden ser NULL y almacenará una marcada como en la lista de valores NULL. Si no hay una columna que permita almacenar NULL en la tabla, la lista de valores NULL no existe.
Cuando el valor del bit binario es 1, significa que el valor de la columna es NULO.
Cuando el valor del bit binario es 0, significa que el valor de la columna no es NULL.

 

    # 假如有三个字段 id,name,age其中name是变长类型(Varchar)
    |id|name|age|
    |1|wang|18|
    
    磁盘里的存储为:
    0x04 00 数据头 1 wang 18
    
    # 其中00表示name,age都不为空,当然这里id是主键,肯定不为空,所以没记录

 

 

 

Registrar la información del encabezado

Además de la lista de longitud de campo de longitud variable y la lista de valores NULL, también hay una información de encabezado de registro que se usa para describir el registro, que se compone de 5 bytes fijos. 5 bytes son 40 bits binarios y diferentes bits tienen diferentes significados, como se muestra en la figura:
Inserte la descripción de la imagen aquí

Datos reales registrados

Además de los datos en las columnas definidas por nosotros mismos, los datos reales registrados también tendrán tres columnas ocultas: de
Inserte la descripción de la imagen aquí
hecho, los nombres reales de estas columnas son en realidad: DB_ROW_ID, DB_TRX_ID, DB_ROLL_PTR.

Si una tabla no define manualmente una clave principal, se seleccionará una clave única como clave principal. Si incluso la clave única no está definida, se agregará una columna oculta denominada row_id a la tabla como clave principal de forma predeterminada. Por lo tanto, row_id solo existe cuando no hay una clave principal personalizada ni una clave única.

Datos de desbordamiento de filas

La columna de tipo VARCHAR (M) puede ocupar hasta 65535 bytes. Entre ellos, M representa el número máximo de caracteres almacenados en este tipo. Si usamos el juego de caracteres ascii, un carácter representa un byte. Veamos si VARCHAR (65535) está disponible: el
Inserte la descripción de la imagen aquí
mensaje de error significa: MySQL ocupa un registro El máximo el espacio de almacenamiento es limitado, a excepción de las columnas de tipo BLOB o TEXT, todas las demás columnas (excluidas las columnas ocultas y la información del encabezado del registro) ocupan una longitud total de bytes que no puede exceder los 65535 bytes. Además de los datos de la columna en sí, estos 65535 bytes también incluyen algunos otros datos. Por ejemplo, para almacenar una columna de tipo VARCHAR (M), en realidad necesitamos ocupar 3 partes de espacio de almacenamiento:

  1. datos reales
  2. La longitud de los datos reales del campo de longitud variable.
  3. Identificación de valor NULO

Si la columna de tipo VARCHAR no tiene el atributo NOT NULL, solo puede almacenar hasta 65532 bytes de datos, porque la longitud del campo de longitud variable ocupa 2 bytes y el identificador de valor NULL debe ocupar 1 byte.
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Desbordamiento causado por demasiados datos en el registro

El tamaño de una página es generalmente de 16 KB, que son 16384 bytes, y una columna de tipo VARCHAR (M) puede almacenar hasta 65533 bytes, por lo que puede suceder que una página no pueda almacenar un registro.

En los formatos de fila Compact y Reduntant , para las columnas que ocupan un espacio de almacenamiento muy grande, solo una parte de los datos de la columna se almacenará en los datos reales del registro, y los datos restantes se almacenarán en varias otras páginas, y luego el Se registrarán datos reales. La ubicación de datos utiliza 20 bytes para almacenar las direcciones que apuntan a estas páginas (por supuesto, estos 20 bytes también incluyen el número de bytes ocupados por los datos dispersos en otras páginas), de modo que los datos restantes puedan ser encontró

 

Desbordamiento causado por demasiados datos en el registro

El tamaño de una página es generalmente de 16 KB, que son 16384 bytes, y una columna de tipo VARCHAR (M) puede almacenar hasta 65533 bytes, por lo que puede suceder que una página no pueda almacenar un registro.

En los formatos de fila Compact y Reduntant , para las columnas que ocupan un espacio de almacenamiento muy grande, solo una parte de los datos de la columna se almacenará en los datos reales del registro, y los datos restantes se almacenarán en varias otras páginas, y luego el Se registrarán datos reales. La ubicación de datos utiliza 20 bytes para almacenar las direcciones que apuntan a estas páginas (por supuesto, estos 20 bytes también incluyen el número de bytes ocupados por los datos dispersos en otras páginas), de modo que los datos restantes puedan ser encontró

 

 

Formatos dinámicos y comprimidos

Estos dos formatos de fila son similares al formato de fila COMPACT, pero son un poco diferentes cuando se trata de datos de desbordamiento de filas. No almacenarán parte de los datos en los datos reales del registro, sino que almacenarán todos los datos en otras páginas. Almacene las direcciones de otras páginas en los datos reales registrados. Además, el formato de línea comprimida utiliza un algoritmo de compresión para comprimir la página.

 

 

 

Materiales de referencia:
Cómo almacenar campos de longitud variable en Mysql      https://blog.csdn.net/weixin_29491885/article/details/104846592

Análisis del formato de fila innodb y la página de datos y principio subyacente del índice   https://blog.csdn.net/java_eehehe/article/details/105529353           https://www.cnblogs.com/qcfeng/p/7325307.html

Supongo que te gusta

Origin blog.csdn.net/liuming690452074/article/details/113820877
Recomendado
Clasificación