Particionamento MySQL: Existe uma troca de desempenho entre o número de partições e o tamanho de cada partição?

10

Eu tenho uma tabela grande (vários 100 milhões de linhas) que gostaria de particionar eficientemente. Minha pergunta é se existe uma troca entre o tamanho da partição e o número de partições. Pelo que entendi, a maioria das consultas em uma coluna usada na partição será mais rápida porque a consulta (para a maioria das consultas) precisará apenas pesquisar na partição aplicável à consulta. Portanto, faria sentido que, para maximizar a eficiência, você devesse dividir uma tabela grande no número máximo de partições, tornando cada partição o menor possível. No caso do MySQL, isso significa 1024 partições. Mas existe alguma desvantagem de desempenho em ter um grande número de partições? Então, como encontrar o número ideal de partições?

Nota: Já existe uma pergunta semelhante no stackoverflow , mas apenas uma resposta, que (da minha perspectiva) erra o alvo. Então, vou declarar a pergunta do meu jeito ... espero que seja mais claro

robguinness
fonte

Respostas:

6

Vamos compará-los

TAMANHO DA PARTIÇÃO

Se você tem o seguinte:

  • 100 milhões de linhas em uma tabela
  • Indexação BTREE
  • Cada página do BTREE possui 1024 teclas

Como seriam as métricas?

Como LOG (100000000) / LOG (2) = 26.575424759099, um índice BTREE com 1024 chaves por modo de árvore de página teria uma altura de árvore de apenas 3 (CEILING (LOG (100000000) / LOG (1024))). Com apenas três nós de páginas, uma pesquisa binária da chave necessária em cada código de árvore acessado resultaria em uma remoção e isolamento de cerca de 30 chaves.

NÚMERO DE PARTIÇÕES

Se você tem o seguinte:

  • 100 milhões de linhas em uma tabela
  • Indexação BTREE
  • Cada página do BTREE possui 1024 teclas
  • Você cria 1024 paritições

Os números seriam ligeiramente diferentes.

Cada partição deve ter cerca de 97656 linhas. Quais seriam as métricas agora?

Como LOG (97656) / LOG (2) = 16.575421065795, um índice BTREE com 1024 chaves por modo de árvore de página teria uma altura de árvore de apenas 2 (CEILING (LOG (97656) / LOG (1024))). Com apenas dois nós de páginas, uma pesquisa binária da chave necessária em cada código de árvore acessado resultaria em uma remoção e isolamento de cerca de 20 chaves.

CONCLUSÃO

A distribuição das chaves apenas remove um nível de árvore, mas cria essencialmente 1024 índices. As consultas não saberão a diferença. O tempo de pesquisa provavelmente seria nominal, na melhor das hipóteses, a favor das partições. No entanto, verifique se todos os dados estão ativos. Além disso, você pode estar atingindo apenas algumas partições, enquanto outras partições com dados raramente acessados ​​apenas ocupam espaço e nunca são acessadas com frequência suficiente para justificar o particionamento . Você pode ter métricas de desempenho diferentes para se preocupar, que são mais flagrantes (como desfragmentação interna no XFS , ext3 x ​​ext4 etc.) Você também precisa se preocupar com o mecanismo de armazenamento que está usando, porque:

  • A indexação do InnoDB seria um pouco mais confusa em comparação com o MyISAM, devido à necessidade de gerenciar um índice em cluster
  • O InnoDB duplica a gravação de dados no ibdata1, bem como no arquivo de log atual (ib_logfile0 ou ib_logfile1)
RolandoMySQLDBA
fonte
11
Obrigado, RolandoMySQLDBA, isso é muito interessante. O que entendo disso é que o particionamento terá uma influência positiva pequena, mas apreciável, na velocidade da consulta, mas pode ter outros efeitos negativos, como fragmentação. O que estou interessado, no entanto, é como determinar o número ideal de partições. Devo sempre usar o número máximo permitido (ou seja, 1024) ou algum outro número pode ser um bom compromisso entre os efeitos positivos e negativos? Ou não é possível analisar esse tipo de otimização?
robguinness
Aliás, este artigo sugere que a resposta é um pouco mais complicado: mysqlperformanceblog.com/2010/12/11/...
robguinness
A resposta é boa, mas trata-se de pesquisar por chave (ou campo indexado). Não tenho muita experiência com particionamento, mas, do meu ponto de vista, é útil quando você precisa fazer uma verificação completa da tabela. Nesse caso, você varre apenas várias partições em vez da tabela inteira.
Cherry