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.
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.
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
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 |
|
|
Nome da tabela a ser convertida |
|
|
Lista de colunas da chave de particionamento. Não há suporte para expressões. |
|
|
Expressão usada para o particionamento por intervalo |
|
|
Nome da partição |
|
|
Valores da partição |
|
|
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.
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 |
**PolarDB |
|
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 |