Estou tendo dificuldades para entender a ideia de prós e contras do particionamento de tabelas. Estou prestes a começar o trabalho em um projeto com 8 tabelas e uma delas será a principal tabela de dados que conterá entre 180 e 260 milhões de registros. Como a tabela será indexada corretamente, estou pensando em limitar os registros da tabela para 20 milhões dessa maneira, teria que criar 9 a 13 tabelas.
Mas não tenho muita certeza de como isso irá melhorar o desempenho, porque eles estarão na mesma máquina (32 GB de RAM)?
Eu estou usando MySQL e tabelas seria MyISAM e tabela grande teria índice no campo id e não há mais complexidades como pesquisa de texto completo etc.
Por favor, também lance luz sobre particionamento de tabela versus particionamento de banco de dados.
fonte
Respostas:
O que se segue é simplesmente insano e delirante ...
Se você deixar todos os dados em uma tabela (sem particionamento), você terá tempos de pesquisa de O (log n) usando uma chave. Vamos pegar o pior índice do mundo, a árvore binária. Cada nó da árvore possui exatamente uma chave. Uma árvore binária perfeitamente equilibrada com 268.435.455 (2 ^ 28 - 1) nós de árvore teria uma altura de 28. Se você dividir essa árvore binária em 16 árvores separadas, obterá 16 árvores binárias, cada uma com 16.777.215 (2 ^ 24 - 1) nós da árvore para uma altura de 24. O caminho da pesquisa é reduzido em 4 nós, uma redução de altura de 14,2857%. Se o tempo de pesquisa estiver em microssegundos, uma redução de 14,2857% no tempo de pesquisa será nula a desprezível.
Agora, no mundo real, um índice BTREE teria códigos de árvore com várias chaves. Cada pesquisa BTREE executaria uma pesquisa binária dentro da página, com um possível decente em outra página. Por exemplo, se cada página BTREE contivesse 1024 chaves, uma altura de árvore de 3 ou 4 seria a norma, uma altura de árvore curta.
Observe que o particionamento de uma tabela não reduz a altura do BTREE, que já é pequena. Dado um particionamento de 260 milhões de linhas, existe a forte probabilidade de ter vários BTREEs com a mesma altura. A procura de uma chave pode passar por todas as páginas raiz do BTREE todas as vezes. Somente um cumprirá o caminho do intervalo de pesquisa necessário.
Agora expanda isso. Todas as partições existem na mesma máquina. Se você não tiver discos separados para cada partição, terá E / S de disco e rotações de eixo como um gargalo automático fora do desempenho da pesquisa de partição.
Nesse caso, o pareamento por banco de dados também não comprará nada se id for a única chave de pesquisa sendo usada.
O particionamento de dados deve servir para agrupar dados de maneira lógica e coesa na mesma classe. O desempenho da pesquisa em cada partição não precisa ser a principal consideração, desde que os dados sejam agrupados corretamente. Depois de obter o particionamento lógico, concentre-se no tempo de pesquisa. Se você estiver apenas separando os dados apenas por ID, é possível que muitas linhas de dados nunca sejam acessadas para leituras ou gravações. Agora, isso deve ser uma consideração importante: localize todos os IDs acessados com mais frequência e particione com isso . Todos os IDs acessados com menos frequência devem residir em uma grande tabela de arquivamento que ainda está acessível pela pesquisa de índice para a consulta "uma vez na lua azul".
O impacto geral deve ser ter pelo menos duas partições: uma para os IDs acessados com freqüência e a outra para o restante dos IDs. Se os IDs acessados com frequência forem bastante grandes, você poderá opcionalmente particioná-lo.
fonte
Certamente 200 milhões de linhas estão no intervalo em que você pode se beneficiar do particionamento de tabelas. Dependendo da sua inscrição, você pode apostar alguns dos benefícios listados abaixo:
Facilidade de limpeza de dados antigos Se você precisar limpar registros com mais de (digamos) 6 meses, poderá particionar a tabela na data e depois trocar as partições antigas. Isso é muito mais rápido do que excluir dados de uma tabela e geralmente pode ser feito em um sistema ativo. No caso do OP, isso pode ser útil para a manutenção do sistema.
Múltiplos volumes de disco O particionamento permite dividir dados para distribuir o tráfego em vários volumes de disco, para maior velocidade. Com um controlador RAID moderno, isso provavelmente não será um problema para o OP.
Varreduras mais rápidas de tabela e intervalo Realmente, um sistema operacional não deve fazer esse tipo de coisa, mas um armazém de dados ou sistema similar fará esse tipo de consulta em quantidade. As varreduras de tabela usam principalmente o tráfego de disco seqüencial; portanto, elas geralmente são a maneira mais eficiente de processar uma consulta que retorna mais de uma porcentagem das linhas de uma tabela.
O particionamento por um filtro comum (geralmente baseado em tempo ou período) permite que grandes blocos da tabela sejam eliminados dessas consultas se o predicado puder ser resolvido com a chave de particionamento. Também permite que a tabela seja dividida em vários volumes, o que pode proporcionar ganhos significativos de desempenho para grandes conjuntos de dados. Normalmente, isso não é um problema para sistemas operacionais.
Para os propósitos do OP, é provável que o particionamento não alcance muitos benefícios de desempenho para consultas operacionais, mas pode ser útil para o gerenciamento do sistema. Se houver algum requisito significativo para relatar agregados em grandes volumes de dados, um esquema de particionamento apropriado pode ajudar nisso.
fonte
O particionamento permite reorganizações simultâneas por partição, se todos os seus índices estiverem particionados. Caso contrário, as partições ainda são muito menores e usam menos espaço de trabalho para reorganizar. E, internamente, qualquer DBMS "bom" pode fazer coisas em paralelo com tabelas particionadas. Isso provavelmente NÃO inclui MySQL ou MyISAM, embora ....
fonte
UNIQUE
eFOREIGN KEY
não estão realmente disponíveis em tabelas particionadas. Particionamento no MyISAM versus InnoDB - não há diferença com relação às coisas discutidas neste tópico.