Melhor criar uma tabela para cada conta de usuário ou uma tabela enorme para todos os dados do usuário no MYSQL

8

Estou criando um diretório da web que permitirá que usuários individuais se inscrevam em uma conta e armazenem essencialmente documentos de texto em uma entrada de banco de dados mysql.

Inicialmente, provavelmente haverá apenas algumas centenas de usuários, mas esperamos ter de 10.000 a 100.000 em algum momento. E cada usuário seria capaz de carregar 100-200 "documentos".

Seria mais eficiente criar uma tabela massiva, indexada por um número de usuário? Teoricamente, o que poderia aumentar para 20.000.000 de entradas. Ou para criar uma tabela para cada usuário com seus documentos individuais?

Estou assumindo que não é saudável ter milhares de tabelas em um banco de dados, mas realmente não consigo encontrar dados concretos sobre isso.

Keith
fonte

Respostas:

7

O MySQL pode lidar facilmente com 20 milhões de linhas se estiver corretamente indexado. Temos tabelas com mais de um bilhão de linhas.

Ter uma mesa é mais limpa. Não precisa fazer mágica no aplicativo com base no usuário (nome). Também é mais fácil fazer estatísticas na tabela de documentos.

Eu definitivamente iria com a abordagem de uma grande mesa. Se você estiver preocupado com o tamanho (físico) da tabela, considere particionar a tabela de documentos. http://dev.mysql.com/doc/refman/5.5/en/partitioning-types.html

Károly Nagy
fonte
Obrigado pela resposta. Definitivamente vou escolher uma única tabela e pesquisarei a abordagem de particionamento. Uma pergunta, porém, o que exatamente se entende por uma tabela indexada corretamente? Eu ouço muito isso referenciado e presumo que isso significa que a tabela do banco de dados precisa de uma chave de índice definida corretamente. Mas há mais do que isso para a melhor otimização.
Keith
Com indexado corretamente, eu quis dizer ter pelo menos um índice composto no user_id com as colunas pelas quais você está filtrando ou ordenando na tabela de documentos e índice no nome de usuário na tabela de usuários (provavelmente um índice parcial é suficiente para verificar a cardinalidade 90-95 % basta). Por exemplo: sqlfiddle.com/#!2/9fb15/2 (Na minha caso com índice parcial em 5 cardinalidade nome de utilizador é de 50%)
Károly Nagy
Eu acho que entendo, obrigado pela ajuda. Mais uma pergunta, supondo que você tenha uma chave de índice primária para cada tabela, ainda ajuda na otimização a definir colunas adicionais que você sabe que procurará regularmente (como a categoria pai) como um índice? Existe uma desvantagem na definição de uma chave primária ou exclusiva e de 2 a 4 índices para cada tabela?
Keith
Os índices ajudarão, sim. Na verdade, você sempre deve ter índices nas colunas nas quais está filtrando, caso contrário, a consulta terminará em uma pesquisa de varredura completa. A única desvantagem (além do tamanho do índice) é inserções e atualizações mais lentas, no entanto, desde o 5.1 com o plugin InnoDB e 5.5 por padrão, o MySQL tem criação rápida de índice ( dev.mysql.com/doc/refman/5.5/en/… ), portanto não é um grande problema mais.
Károly Nagy