Após a versão 5.0.3 (que permitia que o VARCHAR tivesse 65.535 bytes e parou de truncar espaços à direita), existe alguma diferença importante entre esses dois tipos de dados?
Eu estava lendo a lista de diferenças e as duas únicas são:
Para índices nas colunas BLOB e TEXT, você deve especificar um comprimento de prefixo de índice. Para CHAR e VARCHAR, um comprimento de prefixo é opcional. Consulte a Seção 7.5.1, “Índices de colunas”.
e
As colunas BLOB e TEXT não podem ter valores PADRÃO.
Portanto, devido a essas duas limitações no tipo de dados TEXT, por que você o utilizaria sobre o varchar (65535)? Existem ramificações de desempenho de uma sobre a outra?
mysql
database-design
datatypes
Derek Downey
fonte
fonte
Respostas:
dividido vinculado a algumas informações que explicam o problema básico (há diferenças de desempenho), mas não é simples o suficiente para dizer que um é sempre melhor que o outro. (caso contrário, não haveria razão para ter os dois.) Além disso, no MyISM, o tamanho máximo de 64k do VARCHAR não é por campo - é por registro.
Basicamente, existem 4 maneiras de armazenar seqüências de caracteres nos registros do banco de dados:
O MyISM usa algo semelhante ao nº 3 para o VARCHAR e uma abordagem híbrida para o TEXT, onde ele armazena o início da string no registro e o restante da string em outro lugar. O InnoDB é semelhante ao VARCHAR, mas armazena o campo TEXTO completo fora do registro.
Com 1 e 4, as coisas no registro são sempre do mesmo tamanho, por isso é mais fácil pular se você não precisar da string, mas precisar dela depois. Tanto o segundo como o terceiro não são tão ruins para as cordas curtas ... o nº 2 deve continuar procurando o marcador, enquanto o nº 3 pode pular adiante ... à medida que as cordas ficam mais longas, o nº 2 fica pior para esse uso específico caso.
Se você realmente precisa ler a sequência, o número 4 é mais lento, pois você precisa ler o registro e, em seguida, leia a sequência que pode ser armazenada em outro local do disco, dependendo de como o banco de dados lida com isso. O número 1 é sempre bem direto e, novamente, você se depara com problemas semelhantes, onde o número 2 piora quanto mais tempo a corda é, enquanto o número 3 é um pouco pior que o número 2 para cordas muito pequenas, mas melhor à medida que aumenta.
Depois, há requisitos de armazenamento ... O número 1 é sempre um comprimento fixo, portanto pode haver inchaço se a maioria das cordas não tiver o tamanho máximo. # 2 tem 1 byte extra; O nº 3 normalmente possui 2 bytes extras se o comprimento máximo = 255, 4 bytes extras se o tamanho máximo for 64k. O item 4 tem o comprimento do ponteiro, mais as regras do item 3 normalmente.
Para implementações específicas no MySQL 5.1, o documentos para o MyISM afirmam :
Enquanto para o InnoDB :
...
como em muitas outras coisas ao lidar com bancos de dados, se você não tem certeza do que é melhor para suas necessidades, tente compará-lo com dados e uso semelhantes e veja como eles se comportam.
fonte
LONGTEXT
eLONGBLOB
são um exemplo disso. Strings de estilo C não são usadas em lugar algum pelo MySQL (que eu saiba). O InnoDB usa uma abordagem 'híbrida', mas é mais complexa, dependendo do tamanho da linha, formato da linha, etc. O armazenamento de seqüências de caracteres no tamanho "fixo" quase nunca é aconselhável, exceto quando na verdade elas são de comprimento constante (código_de_ país, código_de_ código, etc) . O InnoDB possui 4ROW_FORMATs
; o texto discute apenas 1 ou 2 deles.Quando um SELECT precisa criar uma tabela temporária (por exemplo, para classificar os resultados), ele cria uma tabela MEMORY ou uma tabela MyISAM. MEMORY é mais eficiente. Existem restrições à MEMÓRIA - uma é proibir o TEXT e o BLOB. Portanto, um SELECT pode executar mais devagar com TEXT que VARCHAR.
fonte