Pergunta

Eu estou trabalhando em um projeto que é de natureza semelhante a análise website visitante. Ele será usado por 100s de sites com média de 10,000s para 100,000s page views por dia cada um de modo a quantidade de dados será muito grande.

Devo usar uma única tabela com WebsiteID ou uma tabela separada para cada site?

Fazer alterações em um serviço ao vivo com 100s de sites com tabelas separadas para cada parece ser um grande problema. Por outro lado desempenho e escalabilidade são, provavelmente, vai ser um problema com esses dados grandes. Qualquer sugestões, comentários ou conselho é muito bem-vindos.

Foi útil?

Solução

Como sobre uma mesa particionado pelo site FK?

Outras dicas

Eu diria que usar o design que a maioria faz sentido, dado os seus dados -., Neste caso, uma grande mesa

Os registros serão todos do mesmo tipo, com as mesmas colunas, então a partir de um ponto de vista normalização de dados que fazem sentido para tê-los na mesma tabela. Um índice facilita a seleção linhas particulares fácil, especialmente quando as consultas inteiras podem ser satisfeitas por dados em um único índice (que muitas vezes pode ser o caso).

Note que a análise visitante vai necessariamente envolver um grande número de operações em que não há nenhuma maneira fácil de otimizar a não ser para operar em um grande número de linhas de uma vez - por exemplo: contagens, somas e médias. É típico de recursos estatísticas intensivos como este para ser pré-calculados e armazenados, em vez de ao vivo buscado. É algo que você gostaria de pensar.

Se os dados é uniforme, ir com uma tabela. Se você sempre precisa selecionar em todos os sites ter várias tabelas é uma dor. No entanto, se você escrever script suficiente, você pode fazê-lo com várias tabelas.

Você pode usar o mecanismo de armazenamento MERGE do MySQL para fazer SELECTs através das mesas (mas não espere bom desempenho, e atente para o limite rígido Windows no número de arquivos abertos - no Linux você pode haveto usar ulimit para aumentar o limite. não há nenhuma maneira de fazê-lo no Windows).

Eu quebrei uma enorme mesa em muitos (centenas) de tabelas e usado MERGE para SELECT. Eu fiz isso para o que eu poderia executar off-line criação e otimização de cada uma das pequenas mesas. (Por exemplo OPTIMIZE ou ALTER TABLE ... ORDER BY). No entanto, o desempenho do SELECT com MERGE causou-me a escrever o meu próprio mecanismo de armazenamento personalizado. (Descrito http://blog.coldlogic.com/categories/coldstore/ "> aqui)

Use a estrutura de dados única. Uma vez que você começar a encontrar problemas de desempenho existem muitas soluções como você pode particionar suas tabelas pelo site id também conhecido como particionamento horizontal ou você também pode usar a replicação. Isso tudo depende da proporção de lê vs escreve.

Mas para início manter as coisas simples e usar uma tabela com a indexação adequada. Você também pode determinar se você precisa de transações ou não. Você também pode tirar proveito de vários mecanismos de armazenamento do MySQL diferentes, como MyISAM ou NDB (no agrupamento de memória) para aumentar o desempenho. Também cache desempenha um papel muito bom no descarregamento da carga do banco de dados. Os dados que são principalmente somente leitura e pode ser computado facilmente geralmente é colocado no cache eo cache serve o pedido em vez de ir ao banco de dados e apenas as consultas necessárias ir para o banco de dados.

Use uma mesa a menos que você tem problemas de desempenho com o MySQL.

Ninguém aqui não pode responder a perguntas de desempenho, você deve apenas fazer testes de desempenho-se de entender, se ter um grande mesa é suficiente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top