Eu tenho uma tabela de mensagens no MySQL que registra mensagens entre usuários. Além dos IDs e tipos de mensagens típicos (todos os tipos de números inteiros), preciso salvar o texto da mensagem real como VARCHAR ou TEXT. Estou definindo um limite de 3000 caracteres no front-end, o que significa que as mensagens nunca seriam inseridas no banco de dados por mais tempo que isso.
Existe uma justificativa para usar o VARCHAR (3000) ou o TEXT? Há algo sobre escrever VARCHAR (3000) que parece um pouco contra-intuitivo. Já passei por outras postagens semelhantes no Stack Overflow, mas seria bom obter visualizações específicas para esse tipo de armazenamento comum de mensagens.
Respostas:
TEXT
eBLOB
pode ser armazenado fora da mesa com a tabela apenas com um ponteiro para o local do armazenamento real. O local de armazenamento depende de várias coisas, como tamanho dos dados, tamanho das colunas, formato da linha e versão do MySQL.VARCHAR
é armazenado em linha com a tabela.VARCHAR
é mais rápido quando o tamanho é razoável, cuja troca seria mais rápida depende dos seus dados e do seu hardware, você desejaria comparar um cenário do mundo real com seus dados.fonte
varchar
eblob
/text
no InnoDB para pequenos itens de texto? Então seria então aconselhável apenas para fazer de cadavarchar
umtext
tipo e deixar o DB gerir o vs. estouro em linha?Você pode prever quanto tempo a entrada do usuário seria?
fonte
Apenas para esclarecer as melhores práticas:
As mensagens em formato de texto quase sempre devem ser armazenadas como TEXTO (elas acabam sendo arbitrariamente longas)
Os atributos da string devem ser armazenados como VARCHAR (o nome do usuário de destino, o assunto, etc ...).
Entendo que você tenha um limite de front-end, o que é ótimo até que não seja. * sorriso * O truque é pensar no banco de dados como separado dos aplicativos que se conectam a ele. Só porque um aplicativo coloca um limite nos dados, não significa que os dados sejam intrinsecamente limitados.
O que há nas próprias mensagens que as obriga a nunca ter mais de 3000 caracteres? Se for apenas uma restrição arbitrária de aplicativo (por exemplo, para uma caixa de texto ou algo assim), use um
TEXT
campo na camada de dados.fonte
Isenção de responsabilidade: Eu não sou um especialista em MySQL ... mas esse é meu entendimento dos problemas.
Eu acho que o TEXT é armazenado fora da linha do mysql, enquanto eu acho que o VARCHAR é armazenado como parte da linha. Há um comprimento máximo de linha para linhas mysql. Portanto, você pode limitar a quantidade de outros dados que pode armazenar em uma linha usando o VARCHAR.
Também devido ao VARCHAR fazer parte da linha, eu suspeito que as consultas que olham para esse campo serão um pouco mais rápidas do que aquelas que usam um pedaço de texto.
fonte
varchar
coluna de 3000 caracteres pode levar até 9000 bytes.TEXT
inline na tabela.Resposta curta: Nenhuma diferença prática, de desempenho ou de armazenamento.
Resposta longa:
Não há essencialmente nenhuma diferença (no MySQL) entre
VARCHAR(3000)
(ou qualquer outro limite grande) eTEXT
. O primeiro truncará em 3000 caracteres ; o último truncará em 65535 bytes . (Eu faço uma distinção entre bytes e caracteres porque um caractere pode levar vários bytes.)Para limites menores
VARCHAR
, existem algumas vantagensTEXT
.CHARACTER SET
.INDEXes
são limitados em quão grande uma coluna pode ser indexada. (767 ou 3072 bytes ; isso depende da versão e das configurações)SELECTs
são tratadas de duas maneiras diferentes - MEMORY (mais rápida) ou MyISAM (mais lenta). Quando colunas 'grandes' estão envolvidas, a técnica mais lenta é selecionada automaticamente. (Alterações significativas na versão 8.0; portanto, este item de marcador está sujeito a alterações.)TEXT
tipos de dados (em oposição aVARCHAR
) saltam diretamente para o MyISAM. Ou seja,TINYTEXT
é automaticamente pior para as tabelas temporárias geradas do que o equivalenteVARCHAR
. (Mas isso leva a discussão em uma terceira direção!)VARBINARY
é comoVARCHAR
;BLOB
é comoTEXT
.Refutar outras respostas
A pergunta original fazia uma coisa (que tipo de dados usar); a resposta aceita respondeu outra coisa (armazenamento fora de registro). Essa resposta está desatualizada.
Quando esse encadeamento foi iniciado e respondido, havia apenas dois "formatos de linha" no InnoDB. Logo depois, mais dois formatos (
DYNAMIC
eCOMPRESSED
) foram introduzidos.O local de armazenamento para
TEXT
eVARCHAR()
é baseado no tamanho , não no nome do tipo de dados . Para uma discussão atualizada sobre armazenamento on / off-record de grandes colunas de texto / blob, consulte isso .fonte
As respostas anteriores não insistem o suficiente no problema principal: mesmo em consultas muito simples como
uma tabela temporária pode ser necessária e, se um
VARCHAR
campo estiver envolvido, ele será convertido em umCHAR
campo na tabela temporária. Portanto, se você tiver em sua tabela digitado 500.000 linhas com umVARCHAR(65000)
campo, somente esta coluna usará 6,5 * 5 * 10 ^ 9 bytes. Essas tabelas temporárias não podem ser tratadas na memória e são gravadas no disco. Pode-se esperar que o impacto seja catastrófico.Origem (com métricas): https://nicj.net/mysql-text-vs-varchar-performance/ (refere-se à manipulação de
TEXT
vsVARCHAR
no mecanismo de armazenamento MyISAM "padrão" (?). Pode ser diferente em outros, por exemplo, InnoDB.)fonte
Há uma enorme diferença entre VARCHAR e TEXT. Embora os campos VARCHAR possam ser indexados, os campos TEXT não podem. Os campos do tipo VARCHAR são armazenados em linha enquanto o TEXT é armazenado offline, apenas os ponteiros para os dados do TEXT são realmente armazenados nos registros.
Se você precisar indexar seu campo para pesquisar, atualizar ou excluir mais rapidamente do que o VARCHAR, não importa o tamanho. Um VARCHAR (10000000) nunca será o mesmo que um campo de TEXTO, pois esses dois tipos de dados são de natureza diferente.
do que ir para o texto.
fonte
Varchar é para dados pequenos, como endereços de e-mail, enquanto Texto é para dados muito maiores, como artigos de notícias, e Blob, para dados binários, como imagens.
O desempenho do Varchar é mais poderoso porque ele roda completamente da memória, mas isso não será o caso se os dados forem muito grandes, como
varchar(4000)
por exemplo.O texto, por outro lado, não adere à memória e é afetado pelo desempenho do disco, mas você pode evitar isso ao separar os dados de texto em uma tabela separada e aplicar uma consulta de junção esquerda para recuperar dados de texto.
O blob é muito mais lento; portanto, use-o apenas se você não tiver muitos dados, como 10000 imagens, que custarão 10000 registros.
Siga estas dicas para obter velocidade e desempenho máximos:
Use varchar para nome, títulos, e-mails
Use texto para dados grandes
Separe o texto em tabelas diferentes
Use as consultas de associação à esquerda em um ID, como um número de telefone
Se você estiver usando o Blob, aplique as mesmas dicas de Texto
Isso fará com que as consultas custem milissegundos em tabelas com dados> 10 M e tamanho de até 10 GB garantidos.
fonte