Você deve tentar visualizar uma coluna varchar da mesma forma que faria com uma coluna char na maioria dos cenários e definir o comprimento de forma conservadora. Você não precisa sempre pensar no modificador var tanto como algo que afeta sua tomada de decisão no comprimento máximo. Realmente deve ser visto como uma dica de desempenho, em vez de que as strings fornecidas serão de comprimentos variados.
Não é uma diretiva que deva ser estritamente seguida pela parte interna do banco de dados, ela pode ser completamente ignorada. No entanto, tome cuidado com isso, pois às vezes a implementação pode vazar (comprimento e preenchimento fixos, por exemplo), embora não devesse em um mundo ideal.
Se você tiver um varchar (255), não terá garantia de que, em termos de desempenho, ele sempre se comportará de maneira diferente de um char (255) em todas as circunstâncias.
Pode parecer fácil configurá-lo em algo como 255, 65535, etc. em linha com o conselho dado no manual sobre requisitos de armazenamento. Isso dá a impressão de que qualquer valor entre 0 (sim, é uma coisa) e 255 terá o mesmo impacto. No entanto, isso não é algo que pode ser totalmente garantido.
Os requisitos de armazenamento tendem a ser verdadeiros ou um bom indicador para mecanismos de armazenamento persistente decentes e maduros em termos de armazenamento em linha. Não é um indicador tão forte para coisas como índices.
Às vezes é uma questão difícil, exatamente quanto comprimento um pedaço de corda deve ter, então configurando-o no limite mais alto que você sabe que deve estar, mas isso não tem impacto. Infelizmente, isso geralmente é algo deixado para o usuário resolver e é realmente um tanto arbitrário. Você realmente não pode dizer nunca ultrapasse o tamanho de uma string, porque talvez haja casos em que você não tem certeza.
Você deve garantir que as consultas do MySQL gerem um erro quando uma string for muito longa, em vez de truncada, para que pelo menos você saiba se ela pode ser muito curta devido à emissão de erros. Redimensionar colunas para aumentá-las ou reduzi-las pode ser uma operação DDL cara, isso deve ser mantido em mente.
O conjunto de caracteres também deve ser considerado onde a duração e o desempenho entram em jogo. O comprimento se refere a isso em vez de bytes. Se usar utf8, por exemplo, (não MB4), então varchar (255) é realmente varbinary (3 * 255). É difícil saber como coisas como essa vão realmente funcionar sem executar testes e examinar profundamente o código-fonte / documentação. Por causa disso, é possível que comprimento excessivo tenha um impacto inesperadamente inflado. isso não se aplica apenas ao desempenho. Se um dia você precisar alterar o conjunto de caracteres de uma coluna varchar para uma coluna maior, você pode acabar atingindo algum limite sem recurso, se permitir a presença de cadeias de caracteres excessivamente longas que poderiam ter sido evitadas. Este é normalmente um problema de nicho, mas surge,
Se for descoberto que MAX (LENGTH (coluna)) é sempre <64 (como se fosse decidido que haveria um limite de entrada que não correspondia à definição da coluna), mas você tem varchar (255), então há um boa chance de você usar quatro vezes mais espaço do que o necessário em alguns cenários.
Isso pode incluir:
- Motores diferentes, alguns podem ignorá-lo completamente.
- Tamanhos de buffer, por exemplo, atualizar ou inserir podem ter que alocar o 255 completo (embora eu não tenha verificado o código-fonte para provar isso, é apenas uma hipótese).
- Índices, isso será imediatamente óbvio se você tentar fazer uma chave composta de várias colunas varchar (255).
- Tabelas intermediárias e possivelmente conjuntos de resultados. Dada a maneira como as transações funcionam, pode nem sempre ser possível que algo use o comprimento máximo real das strings em uma coluna, em oposição ao limite definido.
- Otimizações preditivas internas podem usar o comprimento máximo como uma entrada.
- Mudanças nas versões de implementação do banco de dados.
Como regra geral, não há realmente necessidade de um varchar ser mais longo do que o necessário, com problemas de desempenho ou não, então eu recomendo que continue assim quando puder. Fazer mais esforço para amostrar o tamanho de seus dados, impor um limite verdadeiro ou descobrir o limite verdadeiro perguntando / pesquisando é a abordagem ideal.
Quando você não puder, se quiser fazer algo como varchar (255) para casos de dúvida, eu recomendo fazer a ciência. Isso pode consistir em duplicar a tabela, reduzir o tamanho da coluna var char, em seguida, copiar os dados do original e olhar para o tamanho dos dados de índice / linha (indexar a coluna também, também tentar como uma chave primária que pode se comportar de maneira diferente no InnoDB já que as linhas são ordenadas por chave primária). No mínimo, dessa forma você saberá se tem um impacto no IO que tende a ser um dos gargalos mais sensíveis. Testar o uso de memória é mais difícil, é difícil testar exaustivamente. Eu recomendaria testar os piores casos potenciais (consultas com muitos resultados intermediários na memória, verificar com explain para grandes tabelas temporárias, etc).
Se você sabe que não haverá muitas linhas na tabela, não usará a coluna para junções, índices (especialmente compostos, únicos), etc, então provavelmente não terá muitos problemas.
VARCHAR(255) utf8mb4
coluna indexada com aproximadamente 150 mil linhas mede 11,5 MB. Uma tabela com umaVARCHAR(48) utf8mb4
coluna indexada com os mesmos dados (comprimento máximo de 46 caracteres) usou 4,5 MB. Não é realmente uma grande diferença nas consultas, é indexado. Mas adiciona E / S de consulta e coisas como backups de banco de dados.