mysql - quantas colunas são demais?

111

Estou configurando uma tabela que pode ter mais de 70 colunas. Agora estou pensando em dividi-lo, pois alguns dos dados nas colunas não serão necessários sempre que a tabela for acessada. Então, novamente, se eu fizer isso, terei que usar junções.

Em que ponto, se houver, são consideradas colunas em excesso?

Brad
fonte
6
Não precisamos usar SELECT * o tempo todo. Sempre temos a opção de selecionar apenas as colunas de que precisamos para uma determinada situação.
APC
3
70 colunas ?! Quantos deles não podem ser nulos?
Pôneis OMG
1
A grande questão é ... você está normalizando suas tabelas? 70 é uma quantidade incomum, a menos que você esteja deliberadamente desnormalizando para desempenho (muito poucas coisas têm 70 atributos únicos). Se você estiver desnormalizando por uma questão de desempenho, eu concordaria com o ChssPly76 que você pode usar qualquer coisa que o banco de dados permitir.
Godeke
2
@KM. isso é para ser uma piada? Eu sou novo no MySQL e não consigo entendê-lo. Você quis dizer que JOIN é uma coisa boa ou algo para tentar e evitar?
Elia Iliashenko
2
Por mais que as junções sejam uma parte central do SQL, juntar-se apenas por juntar provavelmente degradará o desempenho e a capacidade de manutenção de qualquer aplicativo que você tenha.
jeteon

Respostas:

142

É considerado muito porque está acima do limite máximo suportado pelo banco de dados .

O fato de você não precisar que todas as colunas sejam retornadas por todas as consultas é perfeitamente normal; é por isso que a instrução SELECT permite nomear explicitamente as colunas de que você precisa.

Como regra geral, a estrutura de sua tabela deve refletir seu modelo de domínio; se você realmente tem 70 (100, o que você tem) atributos que pertencem à mesma entidade, não há razão para separá-los em várias tabelas.

ChssPly76
fonte
29
@KM - é por isso que eu disse "atributos pertencentes à mesma entidade no modelo de domínio". Um grande número de colunas na tabela NÃO a torna desnormalizada; é o que as referidas colunas representam que importa. Além disso, embora a normalização seja definitivamente uma coisa boa, NÃO é uma solução para todos os problemas da vida. Pergunta capciosa - você acha que o número de votos ao lado da pergunta / resposta do SO é calculado como select count(*) from votestodas as vezes ou você acha que talvez seja desnormalizado? Isso torna o banco de dados do SO ruim e Jeff Atwood louco?
ChssPly76
@ ChssPly76, é um banco de dados relacional, não um modelo de objeto. existem tabelas, linhas e colunas, trabalhe dentro dessa restrição se quiser desempenho máximo, imite seus objetos por conveniência em prol do desempenho. Portanto, todas as informações sobre uma pessoa devem ser armazenadas na mesma linha? não, divida-os e agrupe-os em tabelas diferentes (usando meu exemplo do meu comentário anterior): "Pessoa", "Atividades" "Registros de saúde". Armazenar uma SUM por motivos de desempenho é um problema completamente diferente de manter todos os dados em 70 colunas para evitar junções.
KM.
20
"NumberOfTeethPulled" deve fazer parte do registro de pessoa? Não, provavelmente não deveria ser armazenado - você obterá essa informação em "ToothExtractionRecord" se o seu modelo de domínio exigir esse nível de detalhe. Mas esse é o SEU exemplo (e, ouso dizer, bastante artificial) - não tem nada a ver com o meu ponto: grande número de colunas em uma tabela NÃO significa que a tabela foi desnormalizada. Pense em contratos imobiliários / ordens de compra / outros documentos financeiros, apenas para citar alguns exemplos. Eles podem ser divididos em várias tabelas? Sim. Alguma razão para fazer isso? Na verdade não.
ChssPly76,
1
+1, isso foi hilário. Se você estiver criando outra tabela e for apenas um relacionamento 1: 1, você provavelmente deve apenas incluí-la na tabela principal. Não vai economizar espaço, não vai ter um desempenho muito melhor se você não solicitar os dados em vez de eles não estarem na tabela. O único motivo legítimo que me vem à mente agora é se há informações confidenciais, como SSN, informações de cartão de crédito, etc ...
Vandel212
1
Se eu tiver uma tabela com 15 cols e outra com 300 cols, a chave primária das duas tabelas será a mesma. Selecione uma coluna nas duas tabelas. O desempenho será significativamente diferente?
uma oferta não pode ser
28

Existem alguns benefícios em dividir a tabela em várias com menos colunas, o que também é chamado de Particionamento Vertical . Aqui estão alguns:

  1. Se você tiver tabelas com muitos registros, a modificação dos índices pode levar muito tempo, pois o MySQL precisa reconstruir todos os índices na tabela. Ter os índices divididos em várias tabelas pode tornar isso mais rápido.

  2. Dependendo de suas consultas e tipos de coluna, o MySQL pode estar gravando tabelas temporárias (usadas em consultas de seleção mais complexas) no disco. Isso é ruim, pois o disco I / O pode ser um gargalo grande. Isso ocorre se você tiver dados binários (texto ou blob) na consulta.

  3. Uma tabela mais ampla pode levar a um desempenho de consulta mais lento.

Não otimize prematuramente, mas em alguns casos, você pode obter melhorias com tabelas mais estreitas.

Jonstjohn
fonte
5
Por que o MySQL precisa reconstruir todos os índices na tabela se apenas um é modificado?
Petr Peller
Eu estava imaginando o mesmo . Por que o MySQL reconstrói todos os índices da tabela? A declaração mencionada acima está correta?
maio de
13

É demais quando viola as regras de normalização. É muito difícil obter tantas colunas se você estiver normalizando seu banco de dados. Projete seu banco de dados para modelar o problema, não em torno de regras artificiais ou idéias sobre otimização para uma plataforma de banco de dados específica.

Aplique as seguintes regras à tabela ampla e você provavelmente terá muito menos colunas em uma única tabela.

  1. Sem elementos repetidos ou grupos de elementos
  2. Sem dependências parciais em uma chave concatenada
  3. Sem dependências de atributos não-chave

Aqui está um link para ajudá-lo.

JohnFx
fonte
17
It is pretty hard to get that many columns if you are normalizing your database.Não é tão difícil quanto parece.
Petr Peller
5
Definitivamente não é tão difícil. As pessoas parecem não entender realmente as formas normais por aqui. Você pode ter 10.000 colunas e AINDA ser normalizado (mesmo para a forma normal mais alta).
Hejazzman
2
@foljs E é exatamente aí que a prática aceita de desnormalização entra. Se você está em um cruzamento e um carro está prestes a bater em você, seria estúpido esperar o sinal ficar verde. Você tem que sair do caminho. Embora passar pela luz vermelha possa não ser tecnicamente legal, você está fazendo o que obviamente deveria fazer dada a situação = desnormalização
user3308043
3
Você me perdeu quando começou a falar sobre carros. Não tenho ideia de qual é a relevância.
JohnFx
2
No entanto, como você faz consultas complexas neste cenário com uma única tabela de dados, você não pode, você tem que depender muito da linguagem de programação e uma variedade de outras coisas para fazer isso funcionar! Então, eu também posso voltar a ter uma tabela com 170 colunas, porque ter consultas "JOIN" e programação extra complexa que é necessária para fazer tabelas separadas funcionarem me parece uma perda de tempo. Acho que sou um grande fã dos princípios do KISS.
Vlad Vladimir Hercules
0

Isso não é um problema, a menos que todos os atributos pertençam à mesma entidade e não dependam uns dos outros. Para tornar a vida mais fácil, você pode ter uma coluna de texto com matriz JSON armazenada nela. Obviamente, se você não tiver problemas em obter todos os atributos todas as vezes. Embora isso anularia totalmente o propósito de armazená-lo em um RDBMS e complicaria muito todas as transações do banco de dados. Portanto, não é recomendável seguir essa abordagem em todo o banco de dados.

Zeeshan Ch
fonte
0

Ter muitas colunas na mesma tabela pode causar grandes problemas na replicação também. Você deve saber que as mudanças que acontecem no mestre irão replicar para o escravo .. por exemplo, se você atualizar um campo na tabela, toda a linha será w

Hoje
fonte