Estou construindo uma tabela bastante grande que inclui uma coluna especÃfica, my_column
. Há um pequeno número de valores possÃveis para my_column
, e cada valor exclusivo de my_column
deve ter o mesmo número de linhas associadas a ele. Além disso, é provável que as consultas sejam focadas apenas em um único valor especÃfico de my_column
cada vez. Vejo que uma opção seria particionar essa tabela grande com base nos valores de my_column
. A outra opção, a meu ver, seria criar uma tabela totalmente separada, de modo que cada tabela se associe exatamente a um valor de my_column
. Eu gostaria de saber o que me levaria a escolher uma opção em detrimento da outra.
Pelo que entendi, uma tabela grande particionada parece ser a maneira "correta" ou "pura" de fazer isso, pois esse parece ser o principal caso de uso para partições. No entanto, suspeito que, por razões práticas, a segunda opção seja melhor, e é para isso que estou inclinado. Não sei se isso importa, mas estou lidando com tabelas MyISAM.
Tenho uma sugestão em relação à sua segunda opção.
Se você precisar manter as tabelas MyISAM com cada
my_column
valor único separado de outras tabelas MyISAM, você pode querer olhar para o mecanismo de armazenamento MERGE (Mrg_MyISAM) como uma alternativa ao particionamento de tabelas.Isso permitirá que suas múltiplas tabelas MyISAM dentro do mesmo banco de dados que possuem estruturas de tabela idênticas e layout de Ãndice sejam mapeadas juntas de forma que uma única consulta atinja todas as tabelas MyISAM.
Suponha que você tenha uma tabela da seguinte forma:
e você tem 3 dessas tabelas (tb1, tb2, tb3) onde
Você pode mesclá-los em um único mapeamento de tabela da seguinte maneira:
Para realizar uma busca em todas as tabelas, basta usar tbmerge. Por exemplo, suponha que você queira ver todos os nomes de tb2 que começam com 'Jack', execute esta consulta:
Dado o design da tabela, você sempre deve especificar o valor para my_column. Na verdade, para cada Ãndice que tb1 possui, certifique-se de que my_column seja sempre a primeira coluna. A razão? Uma consulta em tbmerge é sempre uma consulta em tb1, tb2, tb3 (todas as tabelas subjacentes). Caso contrário, esta consulta
experimentará um desempenho horrÃvel porque executará varreduras de tabela em todas as tabelas subjacentes. Planeje cuidadosamente os Ãndices que você usará, seguindo essa regra simples (usando my_column como a primeira coluna de cada Ãndice)
Há um benefÃcio adicional: você pode INSERT nas tabelas subjacentes conforme sua conveniência, trabalhando assim com o
Discuti isso usando tabelas MERGE em uma postagem anterior (4 de janeiro de 2012) .
O particionamento é melhor se a maioria das consultas em seu sistema:
Digamos que a seguinte consulta seja adequada para ser revisada para particionamento :
O particionamento não é significativamente melhor do que uma única tabela se suas consultas tiverem outras condições que tornem o resultado apenas uma parte trivial do total de linhas nesse valor. Como exemplo a seguir (suponha que haja um Ãndice composto nas colunas participantes):
A porcentagem de linhas esperadas
A porcentagem usada para avaliar a estratégia depende de quantos valores distintos em "my_column" e o tamanho da linha de sua tabela única original.
Quanto menos valores distintos você tiver, menos porcentagem de linhas esperadas deve ser considerada. Quanto mais tamanho de linha você tiver, menos porcentagem de linhas esperadas deve ser considerada.
É melhor projetar alguns experimentos para refletir sua estimativa.