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

Como escolher tipos de dados otimizados para colunas [específico do innodb]?


Resumo breve:

(apenas minhas opiniões)
  1. para endereço de e-mail - VARCHAR(255)
  2. para nome de usuário - VARCHAR(100) ou VARCHAR(255)
  3. para id_username - use INT (a menos que você planeje mais de 2 bilhões de usuários em seu sistema)
  4. números de telefone - INT ou VARCHAR ou talvez CHAR (depende se você deseja armazenar a formatação)
  5. postagens - TEXT
  6. datas - DATE ou DATETIME (definitivamente inclua horários para coisas como postagens ou e-mails)
  7. dinheiro - DECIMAL(11,2)
  8. diversos - veja abaixo

Quanto ao uso do InnoDB porque VARCHAR é suposto ser mais rápido, eu não me preocuparia com isso, ou velocidade em geral. Use o InnoDB porque você precisa fazer transações e/ou deseja usar restrições de chave estrangeira (FK) para integridade de dados. Além disso, o InnoDB usa bloqueio em nível de linha, enquanto o MyISAM usa apenas bloqueio em nível de tabela. Portanto, o InnoDB pode lidar com níveis mais altos de simultaneidade melhor que o MyISAM. Use MyISAM para usar índices de texto completo e para um pouco menos de sobrecarga.

Mais importante para a velocidade do que o tipo de mecanismo:coloque índices nas colunas que você precisa pesquisar rapidamente. Sempre coloque índices em suas colunas ID/PK, como o id_username que mencionei.

Mais detalhes:

Aqui está um monte de perguntas sobre tipos de dados MySQL e design de banco de dados (aviso, mais do que você pediu):

E algumas perguntas sobre quando usar o mecanismo InnoDB:

Eu apenas uso tinyint para quase tudo (sério).

Editar - Como armazenar "postagens:"

Abaixo estão alguns links com mais detalhes, mas aqui está a versão curta. Para armazenar "posts", você precisa de espaço para uma string de texto longa. CHAR comprimento máximo é 255, então isso não é uma opção e, claro, CHAR desperdiçaria caracteres não utilizados versus VARCHAR , que é de comprimento variável CHAR .

Antes do MySQL 5.0.3, VARCHAR comprimento máximo era 255, então você ficaria com TEXT . No entanto, em versões mais recentes do MySQL, você pode usar VARCHAR ou TEXT . A escolha se resume à preferência, mas há algumas diferenças. VARCHAR e TEXT max length agora é 65.535, mas você pode definir seu próprio max em VARCHAR . Digamos que você acha que suas postagens precisarão ter no máximo 2000, você pode definir VARCHAR(2000) . Se você atingir o limite, você pode ALTER você tabela mais tarde e aumenta para VARCHAR(3000) . Por outro lado, TEXT realmente armazena seus dados em um BLOB (1). Ouvi dizer que pode haver diferenças de desempenho entre VARCHAR e TEXT , mas não vi nenhuma prova, então você pode querer investigar mais, mas você sempre pode alterar esse pequeno detalhe no futuro.

Mais importante, pesquisar esta coluna "post" usando um índice de texto completo em vez de LIKE seria muito mais rápido (2). No entanto, você precisa usar o mecanismo MyISAM para usar o índice de texto completo porque o InnoDB não o suporta . Em um banco de dados MySQL, você pode ter uma mistura heterogênea de mecanismos para cada tabela, então você só precisaria fazer sua tabela "posts" usar MyISAM. No entanto, se você realmente precisar de "posts" para usar o InnoDB (para transações), configure um gatilho para atualizar a cópia MyISAM de sua tabela "posts" e use a cópia MyISAM para todas as suas pesquisas de texto completo.

Veja abaixo algumas citações úteis.

Por último, aqui está um ótimo post sobre os prós e contras de VARCHAR versus TEXT. Ele também fala sobre o problema de desempenho: