PolarDB for MySQL PolarDB permite convertir rápidamente una tabla no particionada en una tabla particionada por rango sin redistribuir los datos. En este tema se describe cómo usar PolarDB para efectuar esta conversión.
Contexto
PolarDB Al convertir una tabla no particionada en una tabla particionada por rango, los datos de la tabla original se colocan en la primera partición sin validación y las demás particiones quedan vacías.PolarDB Este método se utiliza normalmente para archivar datos históricos en la primera partición. De esta forma, se evita la reescritura de datos que exige la sintaxis estándar ALTER PARTITION BY, lo cual agiliza la conversión.
Ámbito de aplicación
MySQL 8.0.2: la versión de revisión debe ser 8.0.2.2.19 o posterior.
MySQL 8.0.1: la versión de revisión debe ser 8.0.1.1.34 o posterior.
Si la tabla tiene columnas
INSTANTo índices de almacenamiento en columnas (IMCI), la versión del clúster debe ser MySQL 8.0.2 y la versión de revisión debe ser 8.0.2.2.36 o posterior.
Consulte Query the engine version la consulta de la versión del motor para comprobar la versión del clúster.
Límites
Si una tabla contiene columnas agregadas mediante la instrucción INSTANT ADD COLUMN, no es posible convertirla en una tabla particionada por rango.
Instrucciones
Sintaxis y ejemplos
-
Sintaxis
En la instrucción ALTER TABLE, agregue la palabra clave
WITHOUT VALIDATION.ALTER TABLE table_name PARTITION BY RANGE {(expr) | COLUMNS(column_list)} (partition_definition [, partition_definition] ...) WITHOUT VALIDATION;donde
partition_definition:PARTITION partition_name VALUES LESS THAN {(value | value_list) | MAXVALUE} -
Parámetros
Parámetro
Descripción
table_name
Nombre de la tabla.
column_list
Tipo LIST COLUMNS. Lista de claves de partición. No admite expresiones.
RANGE(expr)
Expresión utilizada para el particionamiento por rango.
partition_name
Nombre de la partición.
value_list
Valores límite de la partición.
MAXVALUE
Valor máximo.
-
Ejemplo
Convierta la tabla no particionada
t1en una tabla particionada por rango.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;t1, todos los datos se mueven apartition p0sin validación. Si confirma que todos los datos de la tabla no particionada se encuentran dentro delp0límite declarado, puede usar esta sintaxis para convertir rápidamente la tabla no particionada en una tabla particionada por rango.NotaAsegúrese de que todos los datos de la tabla no particionada se encuentren dentro del límite de la primera partición. De lo contrario, después de la conversión, es posible que no se puedan recuperar los datos que no cumplan con las reglas de particionamiento.
Cuando se usa la opción WITHOUT VALIDATION, todos los datos de la tabla no particionada se mueven a la primera partición sin validación. Asegúrese de que el límite de partición especificado en la instrucción DDL coincida con todos los datos de la tabla no particionada.
Sintaxis combinada
La palabra clave WITHOUT VALIDATION se puede usar con tablas particionadas por INTERVAL, las cuales crean automáticamente particiones RANGE con el mismo intervalo. Por ejemplo:
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;
Comparación de rendimiento
PolarDB En comparación con el método nativo de MySQL, la conversión de una tabla no particionada a una tabla particionada por rango en PolarDB for MySQL solo actualiza los metadatos de la tabla y no reescribe los datos. Este proceso se completa en menos de 0.1 segundos. El método nativo de MySQL requiere validar y reescribir los datos, por lo que tarda más conforme aumenta el volumen de información.
|
Tamaño de la tabla |
Método estándar ALTER TABLE PARTITION BY de MySQL |
PolarDBSintaxis y ejemplos |
|
1 GB (6001215 filas) |
52.24 segundos |
0.10 segundos |
|
10 GB (59986052 filas) |
8 minutos y 45.82 segundos |
0.07 segundos |