Aprimorando o particionamento em MySQL – Subpartições

Dando seguimento ao post anterior sobre particionamento de tabelas no MySQL, este post explica um passo a mais: subparticionamento.

O MySQL permite que você particione uma partição, onde o primeiro nível (PARTITION) é definido por uma expressão de particionamento, e o nível inferior (SUBPARTITION) é definido por outra.

Para utilizar o subparticionamento, é necessário seguir duas restrições:

  1. O tipo de particionamento (PARTITION) precisa ser dos tipos RANGE ou LIST;
  2. O tipo de particionamento (SUBPARTITION) precisa ser dos tipos HASH ou INDEX.

Portanto, não é possível subparticionar tabelas particionadas por HASH ou INDEX.

É importante notar que o número total de partições de uma tabela (nº de PARTITIONs * nº de SUBPARTITIONs) não pode ultrapassar 1024, que é o máximo que o MySQL suporta. Ex.: se uma tabela é particionada por RANGE em 2 partições, cada partição pode ser subparticionada em 512, pois 2 * 512 = 1024.

Abaixo segue um exemplo de tabela subparticionada:

CREATE TABLE ts (
    id INT,
    purchased DATE
)
PARTITION BY RANGE( YEAR(purchased) )
SUBPARTITION BY HASH( TO_DAYS(purchased) )
SUBPARTITIONS 2 (
    PARTITION p0 VALUES LESS THAN (1990),
    PARTITION p1 VALUES LESS THAN (2000),
    PARTITION p2 VALUES LESS THAN MAXVALUE
);

No exemplo acima a tabela ts possui 3 partições, e cada uma é subparticionada em 2 partições. Assim, temos 6 partições no total.

Veja outro exemplo:

CREATE TABLE ts (
    id INT,
    purchased DATE
)
PARTITION BY RANGE( YEAR(purchased) )
SUBPARTITION BY HASH( TO_DAYS(purchased) ) (
    PARTITION p0 VALUES LESS THAN (1990) (
        SUBPARTITION s0,
        SUBPARTITION s1
    ),
    PARTITION p1 VALUES LESS THAN (2000) (
        SUBPARTITION s2
    ),
    PARTITION p2 VALUES LESS THAN MAXVALUE (
        SUBPARTITION s3,
        SUBPARTITION s4
    )
);

Neste outro exemplo, a tabela ts tem 5 partições no total, pois as partições p0 e p2 são subparticionadas em 2 partições cada, mas a partição p1 tem apenas uma subpartição.

Para saber mais sobre o subparticionamento em MySQL, consulte a documentação oficial do MySQL sobre subparticionamento.