Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Existem desvantagens em usar um varchar(255) genérico para todos os campos baseados em texto?


No armazenamento, VARCHAR(255) é inteligente o suficiente para armazenar apenas o comprimento que você precisa em uma determinada linha, ao contrário de CHAR(255) que sempre armazenaria 255 caracteres.

Mas como você marcou esta pergunta com MySQL, mencionarei uma dica específica do MySQL:como as linhas são copiadas da camada do mecanismo de armazenamento para a camada SQL, VARCHAR os campos são convertidos para CHAR para obter a vantagem de trabalhar com linhas de largura fixa. Assim, as strings na memória ficam preenchidas até o comprimento máximo do seu VARCHAR declarado coluna.

Quando sua consulta gera implicitamente uma tabela temporária, por exemplo, ao classificar ou GROUP BY , isso pode usar muita memória. Se você usa muito VARCHAR(255) campos para dados que não precisam ser tão longos, isso pode tornar a tabela temporária muito grande.

Você também pode gostar de saber que esse comportamento de "preenchimento" significa que uma string declarada com o conjunto de caracteres utf8 é preenchida com três bytes por caractere, mesmo para strings que você armazena com conteúdo de byte único (por exemplo, caracteres ascii ou latin1). E, da mesma forma, o conjunto de caracteres utf8mb4 faz com que a string seja preenchida para quatro bytes por caractere na memória.

Portanto, um VARCHAR(255) em utf8, armazenar uma string curta como "Sem opinião" leva 11 bytes no disco (dez caracteres de caracteres inferiores, mais um byte de comprimento), mas leva 765 bytes na memória e, portanto, em tabelas temporárias ou resultados classificados.

Eu ajudei os usuários do MySQL que, sem saber, criaram tabelas temporárias de 1,5 GB com frequência e preencheram seu espaço em disco. Eles tinham muitos VARCHAR(255) colunas que na prática armazenavam strings muito curtas.

É melhor definir a coluna com base no tipo de dados que você pretende armazenar. Tem benefícios para impor restrições relacionadas a aplicativos, como outras pessoas mencionaram. Mas tem os benefícios físicos de evitar o desperdício de memória que descrevi acima.

É difícil saber qual é o endereço postal mais longo, é claro, e é por isso que muitas pessoas escolhem um VARCHAR longo que é certamente mais longo do que qualquer endereço. E 255 é habitual porque é o comprimento máximo de um VARCHAR para o qual o comprimento pode ser codificado com um byte. Foi também o máximo VARCHAR length no MySQL anterior a 5.0.