Todos os produtos
Search
Central de documentação

PolarDB:Converter uma tabela não particionada em uma tabela particionada por intervalo

Última atualização: Jun 28, 2026

Particionar uma tabela não particionada existente no MySQL padrão exige reescrever toda a tabela e validar cada linha. Esse processo pode levar minutos em tabelas grandes e bloqueia gravações simultâneas. O PolarDB for MySQL elimina essa sobrecarga com o comando ALTER TABLE ... WITHOUT VALIDATION, que converte uma tabela não particionada em uma tabela particionada por intervalo ao atualizar apenas os metadados da tabela. A conversão é concluída em menos de 0,1 segundo, independentemente do tamanho da tabela.

Todas as linhas existentes são alocadas na primeira partição sem validação linha a linha. As demais partições são criadas vazias. O caso de uso típico é o arquivamento: anexar uma tabela não particionada existente como a partição inicial (mais antiga) de uma nova tabela particionada por intervalo e usar as partições subsequentes para novos dados.

Importante

Todas as linhas existentes devem estar dentro do intervalo de valores da primeira partição. Linhas fora desse intervalo declarado permanecem armazenadas fisicamente na primeira partição, mas podem não ser retornadas por consultas com partition pruning, tornando-as efetivamente irrecuperáveis pelo acesso normal.

Nota

Para obter mais informações sobre como converter rapidamente uma tabela não particionada em uma tabela particionada por intervalo, entre no grupo 24490017825 do DingTalk para receber suporte técnico.

Pré-requisitos

Antes de começar, verifique se você possui:

  • Um cluster do PolarDB for MySQL 8.0.2 com versão de revisão 8.0.2.2.10 ou posterior

Para verificar sua versão, consulte a seção "Query the engine version" em Engine versions.

Limitações

Não é possível converter tabelas com colunas adicionadas via INSTANT ADD COLUMN em tabelas particionadas por intervalo.

Converter uma tabela não particionada

Nota

Requer PolarDB for MySQL 8.0.2, versão de revisão 8.0.2.2.10 ou posterior.

Ao executar um comando ALTER TABLE PARTITION BY padrão, o MySQL valida cada linha em relação à definição da partição antes de mover os dados, o que torna o processo lento em tabelas grandes. A cláusula WITHOUT VALIDATION ignora essa verificação e move todos os dados diretamente para a primeira partição, tornando a conversão instantânea.

Syntax

ALTER TABLE table_name
PARTITION BY RANGE {(expr) | COLUMNS(column_list)}
(partition_definition [, partition_definition] ...)
WITHOUT VALIDATION;

partition_definition:

PARTITION partition_name
    VALUES LESS THAN {(value | value_list) | MAXVALUE}

Parameters

Parâmetro

Descrição

table_name

Nome da tabela a ser convertida

column_list

Lista de colunas da chave de particionamento. Não há suporte para expressões.

RANGE(expr)

Expressão usada para o particionamento por intervalo

partition_name

Nome da partição

value_list

Valores da partição

MAXVALUE

Valor máximo na partição

Example

O exemplo a seguir converte a tabela não particionada t1 em uma tabela particionada por intervalo com duas partições.

CREATE TABLE t1 (
    `a` INT,
    `b` INT,
    PRIMARY KEY (a, b)
);

INSERT INTO t1 VALUES (1,1),(2,1),(3,1),(4,1),(111,111),(3333,333);

ALTER TABLE t1
PARTITION BY RANGE (a) (
    PARTITION p0 VALUES LESS THAN (100),
    PARTITION p1 VALUES LESS THAN (200)
) WITHOUT VALIDATION;

Após a execução do comando, todas as linhas de t1 — incluindo aquelas com a = 111 e a = 3333 — são alocadas em p0 sem validação. Linhas cujos valores excedem o limite superior declarado de p0 (a < 100) permanecem armazenadas fisicamente em p0, mas podem não ser recuperadas por consultas com partition pruning.

Importante

Antes de executar WITHOUT VALIDATION, defina o limite superior da primeira partição para cobrir o valor máximo dos seus dados. Se alguma linha exceder esse limite, ela se tornará irrecuperável por meio de consultas normais.

Uso com tabelas particionadas por INTERVAL

A cláusula WITHOUT VALIDATION também funciona com tabelas particionadas por INTERVAL. Isso permite carregar uma tabela não particionada existente como a partição inicial, enquanto o PolarDB for MySQL cria automaticamente partições RANGE subsequentes no intervalo especificado.

Example

CREATE TABLE t1 (
    ID   INT,
    DATE DATE,
    PRIMARY KEY (ID, DATE)
);

ALTER TABLE t1
PARTITION BY RANGE COLUMNS (DATE) INTERVAL (DAY, 1) (
    PARTITION p0 VALUES LESS THAN ('2023-01-31')
) WITHOUT VALIDATION;

Todas as linhas existentes em t1 são alocadas em p0. Novas linhas inseridas após a conversão são direcionadas automaticamente para novas partições diárias criadas pela definição de INTERVAL.

Desempenho

Como WITHOUT VALIDATION atualiza apenas os metadados da tabela, o tempo de conversão é constante, independentemente do tamanho da tabela.

Tamanho da tabela

**MySQL padrão ALTER TABLE PARTITION BY**

**PolarDB WITHOUT VALIDATION**

1 GB (6.001.215 linhas)

52,24 segundos

0,10 segundos

10 GB (59.986.052 linhas)

8 minutos e 45,82 segundos

0,07 segundos