Pergunta

MySQL especifica o formato de linha de uma mesa como fixo ou dinâmico, dependendo dos tipos de dados de coluna. Se uma tabela tem um tipo de dados de coluna de comprimento variável, tais como texto ou VARCHAR, o formato de linha é dinâmico; Caso contrário, é fixo.

A minha pergunta é, qual é a diferença entre os dois formatos de linha? É mais um eficiente do que o outro?

Foi útil?

Solução

A diferença realmente só importa para MyISAM, outros mecanismos de armazenamento não se preocupam com a diferença. EDIT: Muitos usuários comentaram que InnoDB faz cautela: link 1 por steampowered, link 2 por Kaan .

Com MyISAM com largura fixa linhas, existem algumas vantagens:

  1. Nenhuma linha fragmentação: é possível com larguras variáveis ??filas para obter linhas simples dividido em várias seções em todo o arquivo de dados. Isto pode aumentar a buscas em disco e abrandar operações. É possível desfragmentar com OPTIMIZE TABLE, mas isso nem sempre é prático.

  2. Os dados tamanho ponteiro de arquivo: Em MyISAM, há um conceito de um ponteiro de arquivo de dados que é usado quando se precisa referenciar o arquivo de dados. Por exemplo, este é usado em índices quando se referem ao local onde a linha é efectivamente presente. Com tamanhos de largura fixa, este ponteiro baseia-se na linha deslocamento no arquivo (ou seja. Fileiras são 1, 2, 3, independentemente do seu tamanho). Com largura variável, o ponteiro é baseado no deslocamento de byte (isto é. Pode ser linhas 1, 57, 163). O resultado é que, com grandes mesas, as necessidades de ponteiro a ser maiores que em seguida, adiciona potencialmente muito mais sobrecarga para a mesa.

  3. Mais fácil de corrigir no caso de corrupção. Uma vez que cada linha é o mesmo tamanho, se sua tabela MyISAM fica corrompido é muito mais fácil de reparar, assim que você vai apenas dados perder esse é realmente corrompido. Com largura variável, em teoria, é possível que a variável largura ponteiros ficar confuso, que pode resultar em mangueira de dados de uma maneira ruim.

Agora, a principal desvantagem de largura fixa é que ele consome mais espaço. Por exemplo, você precisa usar campos CHAR em vez de campos VARCHAR, então você acaba com espaço extra retomada.

Normalmente, você não tem muita escolha no formato, uma vez que é ditada com base no esquema. No entanto, pode valer a pena se você tiver apenas alguns varchar de ou um único blob / texto para tentar otimizar nesse sentido. Por exemplo, considerar a mudança a única varchar em um char ou dividir o blob em seu próprio mesa.

Você pode ler mais sobre isso em:

http://dev.mysql.com/doc/ refman / 5.0 / en / static-format.html

http://dev.mysql.com/doc/ refman / 5.0 / en / dynamic-format.html

Outras dicas

Uma diferença fundamental ocorre quando você atualizar um registro. Se o formato de linha é fixa, não há nenhuma mudança no comprimento do registro. Em contraste, se o formato de linha é dinâmica e os novos dados faz com que o registro para aumentar em comprimento, um link é usado para apontar para os dados "Estouro" (ou seja, ele é chamado o ponteiro overflow).

Este fragmentos da tabela e geralmente atrasa as coisas. Existe um comando para desfragmentar (OPTIMIZE TABLE), que de alguma forma atenua o problema.

Esta página na documentação do MySQL parece contradizer a resposta top aqui, em que os meios de formato de registro dinâmico algo para tabelas InnoDB, bem como:

http://dev.mysql.com/doc/innodb /1.1/en/innodb-row-format-dynamic.html

meios fixos que cada linha é exatamente o mesmo tamanho. Isso significa que se a 3ª fila em uma página de dados precisa ser carregado, ele será exatamente PageHeader + 2 * RowSize, poupar algum tempo de acesso.

A fim de encontrar o início de um registro dinâmico, deve ser consultada a lista de deslocamentos de recordes, que envolve um engano extra.

Em suma, sim, há uma pequena queda de performance para as linhas dinâmicas. Não, não é uma muito grande. Se você acha que vai ser um problema, teste para ele.

fixo deve ser mais rápida e mais segura do que a dinâmica, com a desvantagem de ter um char-comprimento fixo. Você pode encontrar essa informação aqui: http: //dev.mysql .com / doc / refman / 5.0 / en / static-format.html

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top