Após a versão 5.0.3 (que permitiu que VARCHAR tivesse 65.535 bytes e parou de truncar espaços à direita), há alguma diferença importante entre esses dois tipos de dados?
Eu estava lendo a lista de diferenças e as únicas duas dignas de nota são:
Para índices em 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 coluna”.
e
As colunas BLOB e TEXT não podem ter valores DEFAULT.
Então, por causa dessas duas limitações no tipo de dados TEXT, por que você o usaria sobre varchar(65535) ? Existem ramificações de desempenho de um sobre o outro?
dividido ligado a algumas informações que explicam o problema básico (há diferenças de desempenho), mas não é simples o suficiente dizer que um é sempre melhor que o outro. (caso contrário, não haveria razão para ter ambos.) Além disso, no MyISM, o tamanho máximo de 64k para VARCHAR não é por campo -- é por registro.
Basicamente, existem 4 maneiras de armazenar strings em registros de banco de dados:
MyISM usa algo semelhante ao #3 para VARCHAR e uma abordagem híbrida para TEXT onde armazena o início da string no registro e o restante da string em outro lugar. O InnoDB é semelhante para VARCHAR, mas armazena o campo TEXT completo fora do registro.
Com 1 e 4, as coisas no registro são sempre do mesmo tamanho, então é mais fácil pular se você não precisar da string, mas precisar de coisas depois dela. Tanto o #2 quanto o #3 não são tão ruins para strings curtas... #2 tem que continuar procurando o marcador, enquanto o #3 pode pular adiante... caso.
Se você realmente precisa ler a string, #4 é mais lento, pois você tem que ler o registro e depois ler a string que pode estar armazenada em outro lugar no disco, dependendo de como o banco de dados lida com isso. O nº 1 é sempre bem direto e, novamente, você se depara com problemas semelhantes, onde o nº 2 fica pior quanto maior a corda, enquanto o nº 3 é um pouco pior que o nº 2 para cordas muito pequenas, mas melhor à medida que fica mais longa.
Depois, há requisitos de armazenamento ... # 1 é sempre um comprimento fixo, portanto, pode ter inchaço se a maioria das strings não tiver o comprimento máximo. #2 tem 1 byte extra; #3 normalmente tem 2 bytes extras se comprimento máximo = 255, 4 bytes extras se um comprimento máximo de 64k. #4 tem o comprimento do ponteiro, mais as regras para #3 normalmente.
Para as implementações específicas no MySQL 5.1, os documentos do estado do MyISM :
Enquanto para InnoDB :
...
como acontece com tantas outras coisas ao lidar com bancos de dados, se você não tiver certeza do que é melhor para suas necessidades, tente comparar com dados e uso semelhantes e veja como eles se comportam.
Quando um SELECT precisa criar uma tabela temporária (como para classificar os resultados), ele criará uma tabela MEMORY ou uma tabela MyISAM. A MEMÓRIA é mais eficiente. Existem restrições em MEMORY -- uma delas é não permitir TEXT e BLOB. Portanto, um SELECT pode ser executado mais lentamente com TEXT do que VARCHAR.