Formato de linha compacto Mysql

 

 

 

 

 

Tipo de formato de linha InnoDB (formato compacto)

Diagrama esquemático do formato de linha compacta:

 

 

 

 

Como armazenar campos de comprimento variável no Mysql

 

O MySQL suporta tipos de dados de comprimento variável, varchar (m), varbinary (m), texto, tipos de blob, etc. O espaço de armazenamento ocupado por esses tipos de dados de comprimento variável é dividido em duas partes:

   1. O conteúdo real dos dados

   2. Declare o número de bytes ocupados

Se o número de bytes ocupados pelos dados reais não for salvo, o servidor mysql não pode determinar a extensão dos dados reais, resultando na incapacidade de buscar os dados com precisão. Portanto, quando armazenamos dados reais, precisamos armazenar o número de bytes ocupados por esses dados.

No formato de linha compacto, o comprimento de todos os tipos de comprimento de lado é armazenado no início do registro de linha para formar uma lista, que é armazenada na ordem inversa da coluna .

CHAR é um tipo de comprimento fixo, VARCHAR é um tipo de comprimento variável VARCHAR (M) e M representa o número máximo de caracteres que podem ser armazenados. (MySQL5.0.3 costumava ser bytes antes, e mais tarde são caracteres)

 

Método de armazenamento básico

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

Como armazenar campos de comprimento variável

  • Existe um campo de comprimento variável em uma linha
    # 假如有三个字段 id,name,age其中name是变长类型(Varchar)
    |id|name|age|
    |1|wang|18|
    
    磁盘里的存储为:
    0x04 null值列表 数据头 1 wang 18
    
    # 其中0x04表示name长度为4
  • Várias linhas de dados também são armazenadas lado a lado
    # 假如有三个字段 id,name,age其中name是变长类型(Varchar)
    |id|name|age|
    |1|wang|18|
    |2|li|20|
    
    磁盘里的存储为:
    0x04 null值列表 数据头 1 wang 18 0x02 null值列表 数据头 2 li 20
  • Como armazenar vários campos de comprimento variável em uma única linha
    # 假如有三个字段 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

 

 

 

 

Como a lista de valores NULL é armazenada

O formato de linha compacto irá gerenciar uniformemente as colunas que podem ser NULL, e armazenar aquela marcada como estando na lista de valores NULL.Se não houver uma coluna que permita o armazenamento de NULL na tabela, a lista de valores NULL não existirá.
Quando o valor do bit binário é 1, significa que o valor da coluna é NULL.
Quando o valor do bit binário é 0, significa que o valor da coluna não é NULL.

 

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

 

 

 

Registre as informações do cabeçalho

Além da lista de comprimento de campo de comprimento variável e da lista de valor NULL, há também uma informação de cabeçalho de registro usada para descrever o registro, que é composta de 5 bytes fixos. 5 bytes são 40 bits binários, e bits diferentes têm significados diferentes, conforme mostrado na figura:
Insira a descrição da imagem aqui

Dados reais registrados

Além dos dados nas colunas definidas por nós, os dados reais registrados também terão três colunas ocultas: na
Insira a descrição da imagem aqui
verdade, os nomes reais dessas colunas são: DB_ROW_ID, DB_TRX_ID, DB_ROLL_PTR.

Se uma tabela não definir manualmente uma chave primária, uma chave exclusiva será selecionada como a chave primária. Se mesmo a chave exclusiva não for definida, uma coluna oculta chamada row_id será adicionada à tabela como a chave primária por padrão. Portanto, row_id existe apenas quando não há uma chave primária personalizada e uma chave exclusiva.

Dados de estouro de linha

A coluna do tipo VARCHAR (M) pode ocupar até 65535 bytes. Entre eles, M representa o número máximo de caracteres armazenados neste tipo. Se usarmos o conjunto de caracteres ascii, um caractere representa um byte. Vamos ver se VARCHAR (65535) está disponível: a
Insira a descrição da imagem aqui
mensagem de erro significa: MySQL ocupa um registro O máximo o espaço de armazenamento é limitado, exceto para colunas do tipo BLOB ou TEXT, todas as outras colunas (excluindo colunas ocultas e informações de cabeçalho de registro) ocupam um comprimento total de bytes que não pode exceder 65535 bytes. Além dos dados da própria coluna, esses 65535 bytes também incluem alguns outros dados. Por exemplo, para armazenar uma coluna do tipo VARCHAR (M), precisamos ocupar 3 partes do espaço de armazenamento:

  1. dados reais
  2. O comprimento dos dados reais do campo de comprimento variável
  3. Identificação de valor NULL

Se a coluna do tipo VARCHAR não tiver o atributo NOT NULL, ela só pode armazenar até 65532 bytes de dados, porque o comprimento do campo de comprimento variável ocupa 2 bytes e o identificador de valor NULL precisa ocupar 1 byte.
Insira a descrição da imagem aqui
Insira a descrição da imagem aqui

Estouro causado por muitos dados no registro

O tamanho de uma página é geralmente de 16 KB, que é 16384 bytes, e uma coluna do tipo VARCHAR (M) pode armazenar até 65533 bytes, então pode acontecer que uma página não possa armazenar um registro.

Nos formatos de linha Compact e Reduntant , para colunas que ocupam um espaço de armazenamento muito grande, apenas uma parte dos dados da coluna será armazenada nos dados reais do registro, e os dados restantes serão armazenados em várias outras páginas, e então o dados reais serão gravados. A localização dos dados usa 20 bytes para armazenar os endereços que apontam para essas páginas (é claro, esses 20 bytes também incluem o número de bytes ocupados pelos dados espalhados em outras páginas), de modo que os dados restantes podem ser encontrado

 

Estouro causado por muitos dados no registro

O tamanho de uma página é geralmente de 16 KB, que é 16384 bytes, e uma coluna do tipo VARCHAR (M) pode armazenar até 65533 bytes, então pode acontecer que uma página não possa armazenar um registro.

Nos formatos de linha Compact e Reduntant , para colunas que ocupam um espaço de armazenamento muito grande, apenas uma parte dos dados da coluna será armazenada nos dados reais do registro, e os dados restantes serão armazenados em várias outras páginas, e então o dados reais serão gravados. A localização dos dados usa 20 bytes para armazenar os endereços que apontam para essas páginas (é claro, esses 20 bytes também incluem o número de bytes ocupados pelos dados espalhados em outras páginas), de modo que os dados restantes podem ser encontrado

 

 

Formatos dinâmicos e compactados

Esses dois formatos de linha são semelhantes ao formato de linha COMPACT, mas são um pouco diferentes ao lidar com dados de estouro de linha. Eles não armazenam parte dos dados nos dados reais do registro, mas armazenam todos os dados em outras páginas. Armazene os endereços de outras páginas nos dados reais registrados. Além disso, o formato de linha compactado usa um algoritmo de compactação para compactar a página.

 

 

 

Materiais de referência:
como armazenar campos de comprimento variável no Mysql      https://blog.csdn.net/weixin_29491885/article/details/104846592

Análise do formato de linha do innodb e página de dados e princípio subjacente do índice   https://blog.csdn.net/java_eehehe/article/details/105529353           https://www.cnblogs.com/qcfeng/p/7325307.html

Acho que você gosta

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