Pergunta

Eu estou otimizando alguns tabelas InnoDB em MySQL, então eu corri procedimento analsye () para ver o que as recomendações foram.

Os resultados recomendado tinytext vez de varchar (255) para todos os campos que foram previamente configuradas como varchar (255)

Existe um ganho de desempenho a ser tido usando tinytext ? Estou apenas preocupado com a velocidade aqui, não o tamanho.

Foi útil?

Solução

Não acredito que se alguém lhe diz que TINYTEXT é armazenado em outro caminho, que VARCHAR.

As diferenças reais são:

  • TINYTEXT e outros campos de texto são armazenados separadamente de linha na memória dentro MySQL pilha, enquanto VARCHAR () campos adicionar até 64k limite (de modo que você pode ter mais de 64k em TINYTEXTs, enquanto você não vai com VARCHAR).

  • TINYTEXT e outros 'blob-like' campos forçará camada de SQL (MySQL) para usar em disco tabelas temporárias, sempre que eles são usados, enquanto VARCHAR será ainda classificadas 'na memória' (embora será convertido para CHAR para a largura).

  • InnoDB internamente não me importo se é tinytext ou varchar. É muito fácil de verificar, criar duas tabelas, uma com VARCHAR (255), outro com TINYINT, e inserir um registro para ambos. Ambos levará página 16k único -. Enquanto que se são usados ??páginas de sobrecarga, mesa TINYTEXT deve aparecer como tendo pelo menos 32k em 'SHOW TABLE STATUS'

Eu normalmente prefiro VARCHAR (255) - eles não causar muito de fragmentação pilha para única linha, e pode ser tratada como objeto 64k único na memória dentro do MySQL. Em InnoDB diferenças de tamanho são desprezíveis.

Outras dicas

Eu esperaria varchar para ser mais rápido do que tinytext, e do meu pesquisando por aí que parece ser o consenso geral. Claro que você teria que testar seu sistema para ser verdadeiramente certo.

A razão é mais rápido porque, quando o MySQL faz certos tipos de operações (junta-se, tipos, etc.) que, muitas vezes, criar tabelas temporárias. Quando você tem um tipo BLOB (como tinytext) em uma tabela temporária da tabela será baseado em disco, em vez de memória base, o que naturalmente teria um impacto no desempenho.

CHAR / VARCHAR vai ser mais rápido que estas colunas são armazenados na mesma página como a principal linha de dados *, enquanto que tipos de texto são armazenadas fora da página (Eu estava errado, veja comentário por Harrison ).

As pessoas costumavam usar tinytext muito porque varchar (irritantemente) aparado espaços em branco. Este comportamento foi removido no MySQL 5.0.

(* Pelo menos para os primeiros 768 bytes, e com embutido InnoDB, não o novo InnoDB plug-in).

Você também pode querer olhar usando char(255) - enquanto ele não usar mais espaço, tem sido substancialmente mais rápido (na minha experiência) para usar um campo que é um tamanho constante ao fazer comparações mais tarde. O espaço extra pode ser preenchida com estofamento, se você está procurando apenas a velocidade, então ignorar o espaço em branco mais tarde.

No entanto, nota: MySQL não permitirá a existir varchar e char tipos na mesma tabela. Também não [geralmente] permitir comparações entre varchar e char. Descobri isso no ano passado ao fazer uma implementação de tabela para um hobby projeto .

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