Todos los productos
Search
Centro de documentos

PolarDB:CREATE TABLE (AUTO mode)

Última actualización: Sep 10, 2026

Este tema explica la sintaxis DDL, las cláusulas y los parámetros para crear tablas particionadas en bases de datos de PolarDB-X en modo AUTO.

Notas

  • Antes de usar esta sintaxis para crear tablas particionadas, **asegúrese de que la base de datos lógica actual esté en modo de partición automática (mode='auto')**. Esta sintaxis no es compatible con otros modos. Ejecute el comando SHOW CREATE DATABASE db_name para comprobar el modo de la base de datos lógica actual. Por ejemplo:

    CREATE DATABASE part_db mode='auto';
    Query OK, 1 row affected (4.29 sec)
    
    SHOW CREATE DATABASE part_db;
    +----------+-----------------------------------------------+
    | DATABASE | CREATE DATABASE                               |
    +----------+-----------------------------------------------+
    | part_db  | CREATE DATABASE `part_db` /* MODE = 'auto' */ |
    +----------+-----------------------------------------------+
    1 row in set (0.18 sec)

    Para obtener más detalles sobre la sintaxis de CREATE DATABASE, consulte CREATE DATABASE.

  • Si la clave principal de una tabla particionada no incluye la clave de partición y no es una clave principal de incremento automático, debe garantizar que la clave principal sea única a nivel de aplicación.

  • Para usar la función de subparticionamiento, la versión de la instancia debe ser 5.4.17-16952556 o posterior.

Sintaxis

CREATE [PARTITION] TABLE [IF NOT EXISTS] tbl_name
    (create_definition, ...)
    [table_options]
    [table_partition_definition]
    [local_partition_definition]

create_definition:
    col_name column_definition
  | mysql_create_definition
  | [UNIQUE] GLOBAL INDEX index_name [index_type] (index_sharding_col_name,...)
      [global_secondary_index_option]
      [index_option] ...

index_sharding_col_name:
    col_name [(length)] [ASC | DESC]

index_option:
    KEY_BLOCK_SIZE [=] value
  | index_type
  | WITH PARSER parser_name
  | COMMENT 'string'

index_type:
    USING {BTREE | HASH}

# Global secondary index options
global_secondary_index_option:
    [COVERING (col_name,...)]
    [partition_options]
    [VISIBLE|INVISIBLE]

table_options:
    table_option [[,] table_option] ...

table_option: {
# Specify a table group
    TABLEGROUP [=] value,...,}
    
# Partitioned table type definition
table_partition_definition:
		single
  |	broadcast
  | partition_options

# Partition definition
partition_options:
	partition_columns_definition
	[subpartition_columns_definition]
	[subpartition_specs_definition] /* Defines templated subpartitions. */ 
  partition_specs_definition 

# Partition key definition
partition_columns_definition:
		PARTITION BY
          HASH({column_name | partition_func(column_name)}) partitions_count
        | KEY(column_list) partitions_count
        | RANGE ({column_name | partition_func(column_name)}) 
        | RANGE COLUMNS(column_list)
        | LIST ({column_name | partition_func(column_name)}) 
        | LIST COLUMNS(column_list) 
        | CO_HASH({column_expr_list}) partitions_count 

# Subpartition key definition
subpartition_columns_definition:
		SUBPARTITION BY
          HASH({column_name | partition_func(column_name)}) subpartitions_count
        | KEY(column_list) subpartitions_count
        | RANGE ({column_name | partition_func(column_name)}) 
        | RANGE COLUMNS(column_list)
        | LIST ({column_name | partition_func(column_name)})
        | LIST COLUMNS(column_list)
        | CO_HASH({column_expr_list}) partitions_count

column_expr_list:
	{column_name | partition_func(column_name)},{column_name | partition_func(column_name)}[,{column_name | partition_func(column_name)},...]

partitions_count:
   PARTITIONS partition_count

subpartitions_count:
   SUBPARTITIONS partition_count

# Partitioning functions
partition_func:
    YEAR
  | TO_DAYS
  | TO_MONTHS
  | TO_WEEKS
  | TO_SECOND
  | UNIX_TIMESTAMP
  | MONTH
  | DAYOFWEEK
  | DAYOFMONTH
  | DAYOFYEAR
  | SUBSTR
  | SUBSTRING
  | RIGHT
  | LEFT

# Partition specification
partition_specs_definition:
	hash_partition_list
  | range_partition_list
  | list_partition_list

# Subpartition specification
subpartition_specs_definition:
	hash_subpartition_list
  | range_subpartition_list
  | list_subpartition_list

# HASH/KEY partition definition
hash_partition_list:
	  /* For HASH partitioning, individual partition definitions are optional. */
	| ( hash_partition [, hash_partition, ...] )

hash_partition:
    PARTITION partition_name [partition_spec_options] /* For partitioned tables that have no subpartitions or use templated subpartitions. */
  | PARTITION partition_name subpartitions_count [subpartition_specs_definition] /* Defines non-templated subpartitions within a partition. */

# HASH/KEY subpartition definition
hash_subpartition_list:
  | empty
  | ( hash_subpartition [, hash_subpartition, ...] )

hash_subpartition:
	SUBPARTITION subpartition_name [partition_spec_options]

# RANGE/RANGE COLUMNS partition definition
range_partition_list:
    ( range_partition [, range_partition, ... ] )

range_partition:
    	PARTITION partition_name VALUES LESS THAN (range_bound_value) [partition_spec_options] /* For partitioned tables that have no subpartitions or use templated subpartitions. */
    |	PARTITION partition_name VALUES LESS THAN (range_bound_value) [[subpartitions_count] [subpartition_specs_definition]] /* Defines non-templated subpartitions within a partition. */
   
# RANGE/RANGE COLUMNS subpartition definition
range_subpartition_list:
	( range_subpartition [, range_subpartition, ... ] )

range_subpartition:
    SUBPARTITION subpartition_name VALUES LESS THAN (range_bound_value) [partition_spec_options]
  
range_bound_value:
	  maxvalue /* Defines a MAXVALUE partition for RANGE partitioning. */
	| expr /* Boundary value for a single partition key */
	| value_list /* Boundary values for multiple partition keys */

# LIST/LIST COLUMNS partition definition
list_partition_list:
    (list_partition [, list_partition ...])

list_partition:
    	PARTITION partition_name VALUES IN (list_bound_value) [partition_spec_options] /* For partitioned tables that have no subpartitions or use templated subpartitions. */
    |	PARTITION partition_name VALUES IN (list_bound_value) [[subpartitions_count] [subpartition_specs_definition]] /* Defines non-templated subpartitions within a partition. */

# LIST/LIST COLUMNS subpartition definition
list_subpartition_list:
	(list_subpartition [, list_subpartition ...])

list_subpartition:
	SUBPARTITION subpartition_name VALUES IN (list_bound_value) [partition_spec_options]

list_bound_value:
		default  /* Defines a DEFAULT partition for LIST partitioning. */
	|	value_set

value_set:
	  value_list  /* Set of values for a single partition key */
	| (value_list) [, (value_list), ...] /* Sets of values for multiple partition keys */

value_list:
	value [, value, ...]

partition_spec_options:
	    [[STORAGE] ENGINE [=] engine_name]
        [COMMENT [=] 'string']
        [LOCALITY [=] locality_option]

table_option:
 	    [[STORAGE] ENGINE [=] engine_name]
        [COMMENT [=] 'string']
        [{CHARSET | CHARACTER SET} [=] charset]
        [COLLATE [=] collation]
        [TABLEGROUP [=] table_group_id]
        [LOCALITY [=] locality_option]  

locality_option:
    'dn=storage_inst_id_list'
    
storage_inst_id_list:
    storage_inst_id[,storage_inst_id_list]

local_partition_definition:
		LOCAL PARTITION BY RANGE (column_name)
    [STARTWITH 'yyyy-MM-dd']
    INTERVAL interval_count [YEAR|MONTH|DAY]
    [EXPIRE AFTER expire_after_count]
    [PRE ALLOCATE pre_allocate_count]
    [PIVOTDATE pivotdate_func]
    [DISABLE SCHEDULE]
    
pivotdate_func:
		NOW()
  |	DATE_ADD(...)
  | DATE_SUB(...)
Nota

La sintaxis DDL de PolarDB-X se basa en MySQL. La sintaxis anterior resalta las diferencias principales. Para consultar la sintaxis completa, consulte la documentación de MySQL.

Glosario

  • Clave de partición: una o varias columnas de una tabla particionada que se usan para el particionamiento horizontal.

  • Columna de partición: columna que se usa para calcular y enrutar particiones en una tabla con particionamiento horizontal. Suele formar parte de una clave de partición.

  • Clave de partición vectorial: clave de partición formada por una o varias columnas de partición.

  • Clave de partición de una sola columna: clave de partición compuesta por una única columna de partición.

  • Columna de partición de prefijo: en una clave de partición vectorial con N columnas de partición (N > 1), el prefijo está formado por las primeras K columnas, donde 1 <= K < N.

  • Función de partición: función que recibe una columna de partición como entrada. Su salida proporciona el valor para los cálculos de enrutamiento.

  • Eliminación de particiones: técnica de optimización de consultas que evita examinar particiones innecesarias con base en las definiciones de partición y las condiciones de la consulta.

  • División de puntos críticos: técnica de balanceo de carga que divide una partición saturada mediante la siguiente columna de partición. Esta división se activa cuando las columnas de partición de prefijo de una clave de partición vectorial presentan puntos críticos de acceso o una distribución desigual de datos.

  • Partición física: partición que tiene una correspondencia uno a uno con una subtabla física en un nodo DN.

  • Partición lógica: partición virtual que se asigna a una o varias particiones físicas. Por ejemplo, en una tabla creada con subparticionamiento, las particiones de primer nivel son particiones lógicas.

Parámetros

Parámetro

Descripción

CHARSET | CHARACTER SET

Especifica el conjunto de caracteres predeterminado para las columnas de la tabla. Son compatibles los siguientes conjuntos de caracteres:

  • utf8

  • utf8mb4

  • gbk

COLLATE

Especifica la intercalación predeterminada para las columnas de la tabla. Son compatibles las siguientes intercalaciones:

  • utf8_bin

  • utf8_general_ci

  • utf8_unicode_ci

  • gbk_bin

  • gbk_chinese_ci

  • utf8mb4_general_ci

  • utf8mb4__general_cs

  • utf8mb4_bin

  • utf8mb4_unicode_ci

TABLEGROUP

Especifica el grupo de tablas para la tabla particionada. Si se omite, el sistema busca o crea automáticamente un grupo de tablas compatible que coincida con el método de particionamiento de la tabla.

LOCALITY

Especifica los nodos de datos que almacenan la tabla particionada.

Tablas individuales

En PolarDB-X, puede crear tablas no particionadas mediante la palabra clave SINGLE. Por ejemplo:

CREATE TABLE single_tbl(
 id bigint not null auto_increment, 
 bid int, 
 name varchar(30), 
 primary key(id)
) SINGLE;

Tablas de difusión

En PolarDB-X, puede crear tablas de difusión si especifica la palabra clave BROADCAST. Una tabla de difusión contiene una copia idéntica de sus datos en todos los nodos de datos. Por ejemplo:

CREATE TABLE broadcast_tbl(
 id bigint not null auto_increment, 
 bid int, 
 name varchar(30), 
 primary key(id)
) BROADCAST;

Tabla particionada

Tipos de partición

PolarDB-X le permite crear tablas particionadas según sus necesidades de negocio mediante una cláusula de partición. PolarDB-X admite los cuatro tipos de particionamiento siguientes:

  • Particionamiento hash: esta estrategia enruta los datos al aplicar un algoritmo de hash consistente integrado al valor de una columna de partición o a una expresión de función de partición. El particionamiento hash se subdivide en dos estrategias, particionamiento Key y particionamiento Hash, según si se permite usar una expresión de función de partición o varias columnas de partición como clave de partición.

  • Particionamiento Range: esta estrategia enruta los datos al comparar el valor de una columna de partición o de una expresión de función de partición con rangos de partición predefinidos. Se subdivide en dos estrategias, particionamiento Range Columns y particionamiento Range, según si se permite usar una expresión de función de partición o varias columnas de partición como clave de partición.

  • Particionamiento List: de forma similar al particionamiento Range, esta estrategia enruta los datos al comprobar si el valor de una columna de partición o de una expresión de función de partición pertenece a una lista de valores predefinida para una partición. Se subdivide en dos estrategias, particionamiento List Columns y particionamiento List, según si se usan varias columnas de partición como clave de partición y cómo se utilizan.

  • CoHash: estrategia extendida de particionamiento hash de PolarDB-X diseñada para escenarios de aplicación comunes y específicos. Permite el particionamiento horizontal de una tabla con base en varias columnas de partición correlacionadas.

Tipo Hash

En PolarDB-X existen dos tipos de particionamiento basado en hash: el particionamiento hash y el particionamiento key. Ambos forman parte de la sintaxis de particionamiento estándar de MySQL nativo. Para habilitar funciones flexibles de gestión de particiones —como la división, fusión y migración de particiones— y admitir la división de puntos críticos en claves de partición vectoriales, PolarDB-X redefine el enrutamiento del particionamiento hash y key. Aunque mantiene compatibilidad sintáctica con la sintaxis CREATE TABLE de MySQL, su implementación subyacente de partition routing difiere de la de MySQL. A continuación se describen las diferencias entre el particionamiento key y el particionamiento hash:

Tabla 1. Comparación de las estrategias de particionamiento key y hash

Estrategia de particionamiento

Compatibilidad de clave de partición

Compatibilidad de función de partición

Ejemplo de sintaxis

Funciones y límites

Enrutamiento (consulta puntual)

Key (estrategia de particionamiento predeterminada)

Clave de partición de una sola columna

No

PARTITION BY KEY(c1)

  • No admite la división de puntos críticos.

  • Usa como máximo una columna de partición para el enrutamiento.

  1. Calcula un valor hash, c1_hash, para el valor de la columna c1 mediante un algoritmo de hash consistente.

  2. Enruta los datos a una partición con base en el valor c1_hash.

Clave de partición vectorial

No

PARTITION BY KEY(c1, c2, ..., cn)

  • Admite la división de puntos críticos.

  • De forma predeterminada, el enrutamiento usa solo la primera columna de partición, c1. Las columnas adicionales, como c2 hasta cn, se pueden usar durante la división de puntos críticos.

  • El enrutamiento puede usar hasta n columnas de partición de forma simultánea.

  • De forma predeterminada, el número de columnas de partición (n) no puede superar 5.

  1. Combina los valores de las columnas (c1, c2, ..., cn) en un vector de clave de partición. Luego aplica un algoritmo de hash consistente a cada valor del vector para generar un vector de valores hash correspondiente: (c1_hash, c2_hash, ..., cn_hash).

  2. Aplica un enrutamiento basado en rangos sobre el vector de valores hash (c1_hash, c2_hash, ..., cn_hash) para ubicar la partición de destino.

Hash

Clave de partición de una sola columna

No

PARTITION BY HASH(c1)

  • No admite la división de puntos críticos.

  • El enrutamiento usa una columna de partición.

  • Actualmente admite 11 funciones de partición:

    • YEAR

    • MONTH

    • DAYOFMONTH

    • DAYOFWEEK

    • DAYOFYEAR

    • TO_DAYS

    • TO_MONTHS

    • TO_WEEKS

    • TO_SECONDS

    • UNIX_TIMESTAMP

    • SUBSTR/SUBSTRING

PARTITION BY HASH(c1) equivale a PARTITION BY KEY(c1) y utiliza un algoritmo de enrutamiento idéntico.

Sí

PARTITION BY HASH(YEAR(c1))

  1. Calcula el año a partir del valor de la columna c1 mediante la función de partición YEAR.

  2. Calcula un valor hash, year_hash, para el año mediante un algoritmo de hash consistente.

  3. Enruta los datos a una partición con base en el valor year_hash.

Clave de partición vectorial

No

PARTITION BY HASH(c1, c2, ..., cn)

  • No admite la división de puntos críticos.

  • Después de crear la tabla, el enrutamiento usa de forma simultánea las n columnas de partición.

  • De forma predeterminada, el número de columnas de partición (n) no puede superar 5.

  1. Combina los valores de las n columnas de partición (c1, c2, ..., cn) en un vector. Luego usa un algoritmo de hash consistente para calcular un único valor hash, hashVal, para todo el vector.

  2. Enruta los datos a una partición con base en el valor hashVal.

Ejemplo 1-1: Partición Key

El particionamiento key también es el método de particionamiento predeterminado en PolarDB-X y admite claves de partición vectoriales. Por ejemplo, la siguiente instrucción crea una tabla particionada por el nombre de usuario (name) y el identificador de usuario (id) en ocho particiones:

CREATE TABLE key_tbl(
 id bigint not null auto_increment,
 bid int,
 name varchar(30),
 birthday datetime not null,
 primary key(id)
)
PARTITION BY KEY(name, id)
PARTITIONS 8;

En una partitioned table que usa una KEY partition con una vector partition key, el routing depende de forma predeterminada solo de la primera partition column (name). Por lo tanto, la partition pruning se activa cuando la WHERE clause contiene una equality condition para esta primera partition column. Por ejemplo:

## This query triggers partition pruning and scans only a single partition.
SELECT id from key_tbl where name='Jack';

Si la primera partition column, name, provoca un data imbalance o un data hotspot, puede ejecutar una partition split mediante la siguiente partition column, como id. Para obtener más información, consulte Modify a table group level partition (AUTO mode).

Si una clave de partición vectorial con N columnas de partición usa sus primeras K columnas para el enrutamiento (1 ≤ K ≤ N), incluir condiciones sobre las columnas de partición de prefijo (las primeras K columnas) en la cláusula WHERE activa la eliminación de particiones.

Ejemplo 1-2: Particionamiento Hash

Para usar un identificador de usuario como clave de partición en un particionamiento horizontal, cree la tabla con particionamiento hash y especifique 8 particiones:

CREATE TABLE hash_tbl(
 id bigint not null auto_increment,
 bid int,
 name varchar(30),
 birthday datetime not null,
 primary key(id)
)
partition by hash(id)
partitions 8;

El particionamiento hash admite expresiones de funciones de partición, como YEAR() y TO_DAYS(), para convertir valores de tipos de tiempo a tipos enteros. Por ejemplo, para particionar una tabla por la columna birthday en 8 particiones hash, use la siguiente instrucción:

CREATE TABLE hash_tbl_todays(
 id bigint not null auto_increment,
 bid int,
 name varchar(30),
 birthday datetime not null,
 primary key(id)
)
PARTITION BY HASH(TO_DAYS(birthday))
PARTITIONS 8;

Actualmente, PolarDB-X admite las siguientes funciones de partición:

  • YEAR

  • MONTH

  • DAYOFMONTH

  • DAYOFWEEK

  • DAYOFYEAR

  • TO_DAYS

  • TO_MONTHS

  • TO_WEEKS

  • TO_SECONDS

  • UNIX_TIMESTAMP

  • SUBSTR/SUBSTRING

Para las funciones SUBSTR/SUBSTRING, la clave de partición debe ser de tipo cadena; para todas las demás funciones de partición, debe ser de tipo de tiempo (como DATE, DATETIME o TIMESTAMP).

Ejemplo 1-3: Extensión del particionamiento Hash

PolarDB-X amplía la sintaxis del particionamiento hash para admitir una clave de partición vectorial. A diferencia de la sintaxis de particionamiento estándar de MySQL nativo, PolarDB-X le permite particionar por varias columnas con el método HASH. Use la siguiente instrucción:

CREATE TABLE hash_tbl2(
 id bigint not null auto_increment,
 bid int,
 name varchar(30),
 birthday datetime not null,
 primary key(id)
)
PARTITION BY HASH(name, birthday)
PARTITIONS 8;

A diferencia del particionamiento key, el particionamiento hash usa una clave de partición vectorial en la que todas las columnas de partición participan en los cálculos de hash y de enrutamiento. Por lo tanto, para activar la eliminación de particiones, la cláusula WHERE de una consulta SQL debe especificar condiciones de igualdad para todas las columnas de partición. Por ejemplo, SQL1 puede activar la eliminación de particiones en la tabla hash_tbl2, pero SQL2 no:

##SQL1 (This query triggers partition pruning, scanning only a single partition)
SELECT id from hash_tbl2 where name='Jack' and birthday='1990-11-11';

##SQL2 (This query does not trigger partition pruning, resulting in a full partition scan)
SELECT id from hash_tbl2 where name='Jack';

Dado que el hash partitioning usa toda la partition key para calcular el hash value desde el inicio, en teoría distribuye los datos de manera más uniforme que el key partitioning con una vector partitioning key. Sin embargo, no admite la hotspot splitting, ya que no hay column s posteriores disponibles para dividir una partición saturada.

Límites

  • Límites de tipos de datos

    • Tipos enteros: BIGINT, BIGINT UNSIGNED, INT, INT UNSIGNED, MEDIUMINT, MEDIUMINT UNSIGNED, SMALLINT, SMALLINT UNSIGNED, TINYINT y TINYINT UNSIGNED.

    • Tipos de tiempo: DATETIME, DATE y TIMESTAMP.

    • Tipos de cadena: CHAR y VARCHAR.

  • Límites de sintaxis

    • Cuando se usa una función de partición con una clave de partición de una sola columna para una partición hash, la clave debe ser de tipo de tiempo.

    • Una clave de partición vectorial para una partición hash no admite funciones de partición ni división de puntos críticos.

    • De forma predeterminada, el número máximo de particiones es 8192.

    • De forma predeterminada, el número máximo de columnas de partición es 5.

Uniformidad de datos

  • El algoritmo de hash consistente integrado para el particionamiento key y el particionamiento hash es MurmurHash3, un algoritmo de alto rendimiento con baja probabilidad de colisiones.

  • Con MurmurHash3, la distribución de datos en el particionamiento key y el particionamiento hash suele equilibrarse solo cuando el número de valores distintos de la clave de partición (N) supera 3000. Cuanto mayor sea el valor de N, más equilibrada será la distribución de datos.

Tipo Range

En PolarDB-X existen dos tipos de particionamiento por rango: la partición Range y la partición Range Columns. Ambas forman parte de la sintaxis de particionamiento estándar de MySQL nativo. En la siguiente tabla se comparan estos dos tipos de partición.

Tabla 2. Comparación de las estrategias de particionamiento Range Columns y Range

Estrategia de particionamiento

Compatibilidad de clave de partición

Compatibilidad de función de partición

Ejemplo de sintaxis

Funciones y límites

Enrutamiento (consulta puntual)

Range Columns

Claves de partición de una sola columna y vectoriales

No

PARTITION BY RANGE COLUMNS (c1,c2,...,cn) ( PARTITION p1 VALUES LESS THAN (1,10,...,1000), PARTITION p2 VALUES LESS THAN (2,20,...,2000) ...)

Admite la división de puntos críticos. Por ejemplo, si la columna c1 presenta un punto crítico en el valor 88, puede usar la columna c2 para dividir la partición y resolver el problema.

  1. Crea un vector de clave de partición a partir de los valores de las columnas (c1, c2, ..., cn).

  2. Aplica una búsqueda binaria sobre este vector de clave de partición (c1, c2, ..., cn) para encontrar la partición predefinida correspondiente y luego enruta hacia esa partición.

Range

Clave de partición de una sola columna

Sí

PARTITION BY RANGE(YEAR(c1)) ( PARTITION p1 VALUES LESS THAN (2019), PARTITION p2 VALUES LESS THAN (2021) ...)

  • No admite la división de puntos críticos.

  • Funciones de partición compatibles:

    • YEAR

    • MONTH

    • DAYOFMONTH

    • DAYOFWEEK

    • DAYOFYEAR

    • TO_DAYS

    • TO_MONTHS

    • TO_WEEKS

    • TO_SECONDS

    • UNIX_TIMESTAMP

    • SUBSTR/SUBSTRING

  1. Usa la función de partición YEAR para calcular el año a partir del valor de la columna c1.

  2. Aplica una búsqueda binaria sobre el año calculado para encontrar la partición predefinida correspondiente y luego enruta hacia esa partición.

Ejemplo 2-1: Particionamiento Range Columns

El particionamiento Range Columns admite una clave de partición vectorial, pero no una función de partición. Por ejemplo, para particionar una tabla por identificador de pedido y fecha de pedido, puede usar la siguiente sintaxis de CREATE TABLE:

CREATE TABLE orders(
 order_id int,
 order_time datetime not null)
PARTITION BY RANGE COLUMNS(order_id,order_time)
(
  PARTITION p1 VALUES LESS THAN (10000,'2021-01-01'),
  PARTITION p2 VALUES LESS THAN (20000,'2021-01-01'),
  PARTITION p3 VALUES LESS THAN (30000,'2021-01-01'),
  PARTITION p4 VALUES LESS THAN (40000,'2021-01-01'),
  PARTITION p5 VALUES LESS THAN (50000,'2021-01-01'),
  PARTITION p6 VALUES LESS THAN (MAXVALUE,MAXVALUE)
);
Importante

El particionamiento Range Columns no admite tipos de datos con reconocimiento de zona horaria, como TIMESTAMP y TIME, como clave de partición.

Ejemplo 2-2: Particionamiento Range

El particionamiento Range solo admite una clave de partición de una sola columna. Sin embargo, para una columna de partición de fecha y hora, puede usar funciones de partición como YEAR, TO_DAYS, TO_SECONDS o MONTH para convertir sus valores a enteros.

Importante

El particionamiento Range no admite directamente un tipo de cadena como columna de partición.

Por ejemplo, para crear particiones trimestrales en la columna order_time mediante particionamiento Range, use la siguiente sintaxis:

CREATE TABLE orders_todays(
 id int,
 order_time datetime not null)
PARTITION BY RANGE(to_days(order_time))
(
  PARTITION p1 VALUES LESS THAN (to_days('2021-01-01')),
  PARTITION p2 VALUES LESS THAN (to_days('2021-04-01')),
  PARTITION p3 VALUES LESS THAN (to_days('2021-07-01')),
  PARTITION p4 VALUES LESS THAN (to_days('2021-10-01')),
  PARTITION p5 VALUES LESS THAN (to_days('2022-01-01')),
  PARTITION p6 VALUES LESS THAN (MAXVALUE)
);
Importante

El particionamiento Range solo admite una única columna de tipo entero como clave de partición.

Límites

  • Restricciones de tipos de datos

    • Tipos enteros: BIGINT, BIGINT UNSIGNED, INT, INT UNSIGNED, MEDIUMINT, MEDIUMINT UNSIGNED, SMALLINT, SMALLINT UNSIGNED, TINYINT y TINYINT UNSIGNED.

    • Tipos de fecha y hora: DATETIME y DATE.

    • Tipos de cadena: CHAR y VARCHAR.

  • Restricciones de sintaxis

    • El particionamiento RANGE COLUMNS y el particionamiento RANGE no admiten el uso de un valor NULL como valor límite.

    • El particionamiento RANGE COLUMNS no admite el tipo de datos TIMESTAMP.

    • El particionamiento RANGE solo admite tipos enteros. Si la clave de partición usa el tipo TIMESTAMP, debe usar la función UNIX_TIMESTAMP para garantizar la coherencia de la zona horaria.

    • El particionamiento RANGE no admite la división de puntos críticos.

    • Durante las consultas, los valores NULL se tratan como el valor mínimo para el enrutamiento de particiones.

    • De forma predeterminada, el número máximo de particiones es 8192.

    • De forma predeterminada, el número máximo de columnas de partición es 5.

Tipo List

De forma similar al range type, PolarDB-X subdivide la list partitioning policy en dos tipos: list partitioning y list columns partitioning. Ambos tipos usan la sintaxis de particionamiento estándar de MySQL nativo. Además, PolarDB-X admite una default partition tanto para el list partitioning como para el list columns partitioning. En esta tabla se comparan ambos tipos:

Tabla 3. Comparación de las estrategias de particionamiento List Columns y List

Estrategia de particionamiento

Compatibilidad con la clave de partición

Compatibilidad con funciones de particionamiento

Ejemplo de sintaxis

Funciones y límites

Enrutamiento (consulta puntual)

List Columns

Clave de partición de una sola columna y clave de partición vectorial

No

PARTITION BY LIST COLUMNS (c1,c2,...,cn) ( PARTITION p1 VALUES IN ((1,10,...,1000),(2,20,...,2000) ), PARTITION p2 VALUES IN ((3,30,...,3000),(3,30,...,3000) ), ...)

No es compatible con la división de puntos críticos.

  1. Crea un vector de clave de partición a partir de los valores de las N columnas (c1,c2,...,cn).

  2. Usa un algoritmo de búsqueda binaria sobre el vector de clave de partición (c1,c2,...,cn) para encontrar la partición predefinida y enrutar la consulta hacia la partición de destino.

List

Clave de partición de una sola columna

Sí

PARTITION BY LIST(YEAR(c1)) ( PARTITION p1 VALUES IN (2018,2019), PARTITION p2 VALUES IN (2020,2021) ...)

No es compatible con la división de puntos críticos.

Ejemplo 3-1: Particionamiento por List columns

list columns partitioning admite vector partition keys. Por ejemplo, list columns partitioning le permite particionar pedidos por país y ciudad. La table creation syntax es la siguiente:

CREATE TABLE orders_region(
 id int,
 country varchar(64),
 city varchar(64),
 order_time datetime not null)
PARTITION BY LIST COLUMNS(country,city)
(
  PARTITION p1 VALUES IN (('China','Hangzhou'), ('China','Beijing')),
  PARTITION p2 VALUES IN (('United States','New York'),('United States','Chicago')),
  PARTITION p3 VALUES IN (('Russia','Moscow'))
);
Importante

Actualmente, List Columns partitioning no admite tipos de datos con información de zona horaria como TIMESTAMP y TIME en calidad de partition key.

Ejemplo 3-2: Particionamiento por list

Aunque list partitioning solo admite una single-column partition key, cuando se trata de una partition column de time-type, puede usar partition function expressions como YEAR, MONTH, DAYOFMONTH, TO_DAYS y TO_SECONDS para convertir sus valores a un integer type.

Por ejemplo, para crear una list partition basada en el año de la columna order_time, utilice la siguiente sintaxis de create table:

CREATE TABLE orders_years(
 id int,
 country varchar(64),
 city varchar(64),
 order_time datetime not null)
PARTITION BY LIST(YEAR(order_time))
(
  PARTITION p1 VALUES IN (1990,1991,1992,1993,1994,1995,1996,1997,1998,1999),
  PARTITION p2 VALUES IN (2000,2001,2002,2003,2004,2005,2006,2007,2008,2009),
  PARTITION p3 VALUES IN (2010,2011,2012,2013,2014,2015,2016,2017,2018,2019)
);
Importante

El particionamiento solo admite el integer type como partition key. El string type no es compatible como partition column.

Ejemplo 3-3: Particiones List columns y list con una partición predeterminada

PolarDB-X permite crear list columns partitions y list partitions que incluyen una default partition, hacia donde se enrutan los datos no definidos en las regular partitions.

Importante

Solo se puede definir una partición predeterminada como máximo, y debe ser la última partición.

CREATE TABLE orders_region(
 id int,
 country varchar(64),
 city varchar(64),
 order_time datetime not null)
PARTITION BY LIST COLUMNS(country,city)
(
  PARTITION p1 VALUES IN (('China','Hangzhou'), ('China','Beijing')),
  PARTITION p2 VALUES IN (('United States','New York'),('United States','Chicago')),
  PARTITION p3 VALUES IN (('Russia','Moscow')),
  PARTITION pd VALUES IN (DEFAULT)
);

CREATE TABLE orders_years(
 id int,
 country varchar(64),
 city varchar(64),
 order_time datetime not null)
PARTITION BY LIST(YEAR(order_time))
(
  PARTITION p1 VALUES IN (1990,1991,1992,1993,1994,1995,1996,1997,1998,1999),
  PARTITION p2 VALUES IN (2000,2001,2002,2003,2004,2005,2006,2007,2008,2009),
  PARTITION p3 VALUES IN (2010,2011,2012,2013,2014,2015,2016,2017,2018,2019),
  PARTITION pd VALUES IN (DEFAULT)
);

Límites

  • Restricciones de tipo de datos

    • Tipos enteros: BIGINT, BIGINT UNSIGNED, INT, INT UNSIGNED, MEDIUMINT, MEDIUMINT UNSIGNED, SMALLINT, SMALLINT UNSIGNED, TINYINT y TINYINT UNSIGNED.

    • Tipos de tiempo: DATETIME y DATE.

    • Tipos de cadena: CHAR y VARCHAR.

  • Restricciones de sintaxis

    • El particionamiento List Columns no admite el tipo de datos TIMESTAMP.

    • El particionamiento List solo admite tipos enteros.

    • Ni el particionamiento List Columns ni el particionamiento List admiten la división de puntos críticos.

    • De forma predeterminada, el número máximo de particiones es 8192.

    • De forma predeterminada, el número máximo de columnas de partición es 5.

Tipo CoHash

La política de particionamiento CoHash de PolarDB-X es exclusiva de PolarDB-X.

Requisitos de versión

Utilice la versión 5.4.18-17047709 o posterior.

Casos de uso

Esta estrategia de particionamiento se usa habitualmente en los siguientes escenarios de negocio:

Si una tabla tiene columnas correlacionadas, como c1 y c2, cuyos últimos cuatro caracteres siempre son idénticos, puede particionarla horizontalmente por ambas columnas. De este modo, las consultas SQL con una condición de igualdad en cualquiera de ellas se enrutan a una sola partición.

Por lo tanto, esta estrategia exige que los valores se mantengan consistentes entre varias columnas de partición dentro de la misma tabla particionada.

Ejemplo 4-1: Definir la ubicación conjunta con funciones de partición independientes

Suponga que su aplicación tiene una tabla orders donde las columnas order_id y buyer_id comparten los mismos seis últimos dígitos en cada fila. Para particionar esta tabla por dichos dígitos compartidos y garantizar que una consulta de igualdad sobre cualquiera de las dos columnas se enrute a la misma partición, utilice la siguiente sintaxis:

CREATE TABLE t_orders(
 id bigint not null auto_increment, 
 order_id bigint, 
 buyer_id bigint,
 order_time datetime not null,
 primary key(id)
) 
PARTITION BY CO_HASH(
 	RIGHT(`order_id`,6) /* The last 6 characters of order_id */,
 	RIGHT(`buyer_id`,6) /* The last 6 characters of buyer_id */
) 
PARTITIONS 8;

Ejemplo 4-2: Uso del azúcar sintáctico Range_Hash para migrar usuarios de 1.0 a 2.0

Para una migración de 1.0 a 2.0, considere una tabla orders fragmentada por base de datos y tabla mediante range_hash, definida así: DBPARTIITION BY RANGE_HASH(. Su tabla particionada correspondiente en la base de datos AUTO 2.0 se define de la siguiente manera:

CREATE TABLE orders(
 id bigint not null auto_increment, 
 buyer_id bigint,
 order_id bigint,
 ...
 primary key(id)
) 
PARTITION BY RANGE_HASH(order_id, buyer_Id,6) 
PARTITIONS 8;

PolarDB-X convierte automáticamente la sintaxis RANGE_HASH en una definición de partición CO_HASH. Por ejemplo, RANGE_HASH(order_id, buyer_Id, 6) se transforma en la siguiente definición CO_HASH:

CREATE TABLE orders(
 id bigint not null auto_increment, 
 buyer_id bigint,
 order_id bigint,
 ...
 primary key(id)
) 
PARTITION BY CO_HASH(
 	RIGHT(`order_id`,6) /* Uses the last 6 characters of order_id */,
 	RIGHT(`buyer_id`,6) /* Uses the last 6 characters of buyer_id */
) 
PARTITIONS 8;

Diferencias principales respecto al particionamiento hash/key

Dado que las estrategias de particionamiento CoHash y hash/key son similares, esta sección describe sus principales similitudes y diferencias de uso.

Diferencias principales

CO_HASH

KEY

HASH

Ejemplo de sintaxis

PARTITION BY

CO_HASH(c1, c2)

PARTITIONS 8

PARTITION BY

KEY(c1, c2)

PARTITIONS 8

PARTITION BY

HASH(c1, c2)

PARTITIONS 8

Clave de partición de una sola columna

No compatible

Compatible

Compatible

Clave de partición vectorial

Compatible

Compatible

Compatible

Uso de funciones de partición en columnas de partición vectoriales

Compatible. Por ejemplo:

PARTITION BY

CO_HASH(

Extracts the last 4 characters of c1

RIGHT(c1, 4),

/ Extracts the last 4 characters of c2 /

RIGHT(c2, 4)

)

PARTITIONS 8

No compatible

No compatible

Relación entre las columnas de partición

Una relación de ubicación conjunta. La aplicación debe proporcionar y mantener esta relación entre los valores de las columnas de partición. Por ejemplo:

  • Si los valores de c1 y c2 siempre son idénticos, use CO_HASH(c1, c2).

  • Si los últimos cuatro caracteres de c1 y c2 siempre son idénticos, use CO_HASH(RIGHT(c1,4), RIGHT(c2,4)).

Similar a la relación de prefijo de un índice compuesto.

Similar a la relación de prefijo de un índice compuesto.

Eliminación de particiones en consultas de igualdad por columna de prefijo

Compatible. Por ejemplo:

  • c1='x': Admite la eliminación de particiones y enruta la consulta a una sola partición.

  • c1='x' and c2='y': Admite la eliminación de particiones. La consulta se enruta a una partición si los valores corresponden a la misma, o a cero particiones si corresponden a distintas.

Compatible. Por ejemplo:

  • c1='x': Admite la eliminación de particiones y enruta la consulta a una o más particiones. Si el valor x pasó por una división de punto crítico, la consulta abarca varias particiones.

  • c1='x' and c2='y': Admite la eliminación de particiones y enruta la consulta a una sola partición.

No compatible. La eliminación de particiones requiere condiciones de igualdad en todas las columnas de partición. Por ejemplo:

  • c1='x': No admite la eliminación de particiones y provoca un escaneo completo de particiones.

  • c1='x' and c2='y': Admite la eliminación de particiones y enruta la consulta a una sola partición.

Eliminación de particiones en consultas de igualdad por columnas sin prefijo

Compatible. Las condiciones de igualdad en cualquier columna de partición pueden activar de forma independiente la eliminación de particiones. Por ejemplo:

  • c2='x': Admite la eliminación de particiones y enruta la consulta a una sola partición.

  • c1='x' or c2='y': Admite la eliminación de particiones. El sistema escanea una partición si c1='x' y c2='y' se enrutan a la misma; de lo contrario, escanea dos.

No compatible. Las condiciones de igualdad en columnas de partición sin prefijo requieren un escaneo completo de particiones. Por ejemplo:

  • c2='x': Provoca un escaneo completo de particiones.

  • c1='x' or c2='y': Provoca un escaneo completo de particiones.

No compatible. Las condiciones de igualdad en columnas de partición sin prefijo requieren un escaneo completo de particiones. Por ejemplo:

  • c2='x': Provoca un escaneo completo de particiones.

  • c1='x' or c2='y': Provoca un escaneo completo de particiones.

Consultas por rango

No compatible. Provoca un escaneo completo de particiones.

No compatible. Provoca un escaneo completo de particiones.

No compatible. Provoca un escaneo completo de particiones.

Descripción del enrutamiento (consulta puntual)

  1. Extraiga el valor v1 de la condición de igualdad en una columna de partición (por ejemplo, c1).

  2. Si se aplica una función de partición a la columna, calcule f1 = partFunc(v1); de lo contrario, f1 es v1.

  3. Calcule el valor hash de f1 con el algoritmo de hash consistente para obtener c1_hash, un entero largo.

  4. Enrute la consulta a una partición según el valor c1_hash.

Consulte la comparación entre el particionamiento KEY y HASH en las filas anteriores.

Consulte la comparación entre el particionamiento KEY y HASH en las filas anteriores.

División de puntos críticos

No compatible. No es posible dividir aún más una partición a partir de un valor de punto crítico específico, como c1='88'.

Compatible

No compatible

Gestión de particiones (por ejemplo, división, fusión y migración de particiones)

Compatible

Compatible

Compatible

Subparticionamiento

Compatible

Compatible

Compatible

Consideraciones

  • Su servicio debe mantener la relación coordinada entre los valores de las columnas de partición; PolarDB-X solo valida los resultados del enrutamiento. Cuando utiliza el particionamiento CO_HASH, PolarDB-X comprueba que todos los valores especificados de las columnas de partición de una fila se enruten al mismo fragmento. Sin embargo, no valida si los valores en sí cumplen con la relación coordinada. Esta responsabilidad recae en su servicio.

    Por ejemplo, suponga que su servicio exige que los últimos cuatro caracteres de las columnas c1 y c2 sean idénticos. Si un valor de c1, como 100234, y uno de c2, como 1320, se enrutan ambos al fragmento 0, PolarDB-X permite la operación insert (c1,c2) values (100234,1320) porque el enrutamiento es coherente. No obstante, esta operación infringe la regla del servicio, ya que los últimos cuatro caracteres de c1 (0234) y c2 (1320) no coinciden.

  • Restricciones de DML al modificar columnas de partición Dado que el particionamiento CO_HASH correlaciona los valores de varias columnas de partición, PolarDB-X aplica las siguientes restricciones a las operaciones DML que modifican dichas columnas para evitar una distribución incorrecta de los datos:

    • En las instrucciones insert y replace, si los valores de distintas columnas de partición en una misma fila de la cláusula VALUES se resuelven en particiones diferentes, PolarDB-X rechaza la operación.

    • En las instrucciones update y upsert, debe modificar todas las columnas de partición de forma simultánea en la cláusula SET. Por ejemplo, si c1 y c2 son columnas de partición, debe usar una instrucción como UPDATE t1 SET c1='xx',c2='yy' WHERE id=1. Si los nuevos valores de distintas columnas de partición en una misma fila se resuelven en particiones diferentes, PolarDB-X rechaza la instrucción.

    • Cuando CO_HASH es la estrategia de particionamiento de un índice secundario global (GSI), PolarDB-X también rechaza cualquier operación DML sobre la tabla principal que provoque que los valores de distintas columnas de partición en una fila del GSI se resuelvan en particiones diferentes.

  • Manejo de ceros a la izquierda en tipos enteros. Como las partition columns de una estrategia CO_HASH están correlacionadas, es común definirlas mediante una partition function como SUBSTR, LEFT o RIGHT. Este proceso puede generar ceros a la izquierda cuando se truncan enteros. Por ejemplo, suponga que su lógica de negocio exige que los últimos cuatro caracteres de c1 y c2 sean idénticos. Si c1 es 1000034, los últimos cuatro caracteres forman la string '0034'. Cuando la partition column es de un integer type, CO_HASH convierte automáticamente cualquier valor truncado al integer type de esa columna antes del routing. En consecuencia, CO_HASH convierte la string '0034' en el entero 34, calcula el hash value y enruta la fila. Este proceso gestiona los ceros a la izquierda de forma automática.

Límites de las funciones de partición

  • RIGHT

  • LEFT

  • SUBSTR

Restricciones de tipo de datos

  • Tipos enteros: BIGINT, BIGINT UNSIGNED, INT, INT UNSIGNED, MEDIUMINT, MEDIUMINT UNSIGNED, SMALLINT, SMALLINT UNSIGNED, TINYINT y TINYINT UNSIGNED

  • Tipo de punto fijo: DECIMAL (con una escala de 0)

  • Tipos de tiempo: No compatible

  • Tipos de cadena: CHAR y VARCHAR

Restricciones de sintaxis

  • No se pueden usar funciones de partición anidadas, como SUBSTR(SUBSTR(c1,-6),-4), en una columna de partición.

  • Al utilizar el azúcar sintáctico RANGE_HASH, el parámetro de longitud no debe ser negativo.

  • Todas las columnas de partición deben tener exactamente el mismo tipo de datos, incluidas las siguientes propiedades:

    • Juego de caracteres e intercalación

    • Longitud y precisión

  • De forma predeterminada, el número máximo de particiones es 8192.

  • De forma predeterminada, el número máximo de columnas de partición es 5.

Subpartición

Al igual que MySQL, PolarDB-X admite la sintaxis de subparticionamiento para crear tablas particionadas con subparticiones. El subparticionamiento divide cada partición nuevamente con base en una columna y una estrategia de particionamiento específicas.

  • En una tabla particionada de dos niveles, cada partición de primer nivel es una partición lógica que se asigna a un conjunto de particiones de segundo nivel.

  • Cada partición de segundo nivel es una partición física que se asigna a un fragmento de tabla física específico en un nodo DN.

Con plantilla y sin plantilla

Las particiones de segundo nivel de PolarDB-X se dividen en dos categorías principales: con plantilla y sin plantilla:

  • Subpartición con plantilla: el número de subparticiones y sus valores límite son iguales en todas las particiones.

  • Subpartición sin plantilla: el número de subparticiones y sus valores límite pueden variar en cada partición.

Restricciones de sintaxis

  • De forma predeterminada, una tabla particionada que utiliza subparticionamiento no puede tener más de 8192 particiones físicas.

  • Cuando utiliza particiones sin plantilla, todos los nombres de subpartición deben ser únicos y no coincidir con ningún nombre de partición.

  • Cuando utiliza particiones con plantilla, todos los nombres de subpartición de la plantilla deben ser únicos y no coincidir con ningún nombre de partición.

  • Con el subparticionamiento, el total de particiones físicas de una tabla equivale a la suma de todas las subparticiones de todas las particiones. Esta cifra puede crecer rápidamente. Por ello, gestione con cuidado la cantidad de particiones y subparticiones para evitar la degradación del rendimiento por un exceso de particiones o errores por superar el límite total.

Ejemplo 5-1: Partición secundaria con plantilla

/*
 * This example defines templated subpartitions by using a LIST-KEY composite strategy.
 * The table is first partitioned by LIST COLUMNS into three partitions.
 * Each partition is then subpartitioned by KEY into four subpartitions, resulting in a total of 12 physical partitions.
*/
CREATE TABLE sp_tbl_list_key_tp(
 id int, 
 country varchar(64),
 city varchar(64),
 order_time datetime not null,
 PRIMARY KEY(id)
)
PARTITION BY LIST COLUMNS(country,city) 
SUBPARTITION BY KEY(id) SUBPARTITIONS 4
(
  PARTITION p1 VALUES IN (('China','Hangzhou')),
  PARTITION p2 VALUES IN (('Russian','Moscow')),
  PARTITION pd VALUES IN (DEFAULT)
);

Ejemplo 5-2: Subpartición sin plantilla

/*
 * This example uses a LIST-KEY composite strategy to define non-templated subpartitions.
 * The table is partitioned by LIST COLUMNS into three first-level partitions, each of which is then subpartitioned by KEY.
 * The first-level partitions have 2, 3, and 4 subpartitions, respectively.
 * This results in a total of 9 physical partitions (2 + 3 + 4).
*/
CREATE TABLE sp_tbl_list_key_ntp(
 id int, 
 country varchar(64),
 city varchar(64),
 order_time datetime not null,
 PRIMARY KEY(id)
)
PARTITION BY LIST COLUMNS(country,city) 
SUBPARTITION BY KEY(id)
(
  PARTITION p1 VALUES IN (('China','Hangzhou')) SUBPARTITIONS 2,
  PARTITION p2 VALUES IN (('Russia','Moscow')) SUBPARTITIONS 3,
  PARTITION pd VALUES IN (DEFAULT) SUBPARTITIONS 4
);

Particionamiento automático

Nota

De forma predeterminada, el automatic partitioning está deshabilitado en las bases de datos en AUTO mode. Para habilitar esta función, ejecute el siguiente comando:

SET GLOBAL AUTO_PARTITION=true;

Con el particionamiento automático habilitado:

  • Cuando crea una tabla sin especificar una clave de particionamiento, PolarDB-X la particiona de forma predeterminada por su clave primaria. Si la tabla no tiene clave primaria, utiliza la clave primaria implícita. Este proceso emplea el particionamiento KEY y genera una tabla particionada de nivel 1.

    De forma predeterminada, el número de particiones es ocho veces la cantidad de nodos lógicos de la instancia. Por ejemplo, si se crea una instancia de PolarDB-X con dos nodos lógicos, el número predeterminado de particiones es 16.

  • Además de particionar la tabla principal, PolarDB-X particiona de forma predeterminada todos sus índices. La clave de particionamiento de un índice se compone de las columnas del índice y de las columnas de clave primaria de la tabla.

A continuación se muestra la sintaxis estándar de MySQL para crear una tabla, donde id es la clave primaria y name es la columna indexada:

CREATE TABLE auto_part_tbl(
 id bigint not null auto_increment,
 bid int,
 name varchar(30),
 primary key(id),
 index idx_name (name)
);

Al ejecutar la instrucción SHOW CREATE TABLE se muestra la sintaxis estándar de creación de tablas de MySQL y se oculta automáticamente toda la información de particionamiento:

show create table auto_part_tbl;
+---------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| TABLE         | CREATE TABLE                                                                                                                                                                                                                     |
+---------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| auto_part_tbl | CREATE TABLE `auto_part_tbl` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT,
    `bid` int(11) DEFAULT NULL,
    `name` varchar(30) DEFAULT NULL,
    PRIMARY KEY (`id`),
    INDEX `idx_name` (`name`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8 |
+---------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.06 sec)

Al ejecutar la instrucción SHOW FULL CREATE TABLE se muestra toda la información de particionamiento de la tabla principal y de sus tablas de índice:

show full create table auto_part_tbl;
+---------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| TABLE         | CREATE TABLE                                                                                                                                                                                                                                                                                                                                                                                                              |
+---------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| auto_part_tbl | CREATE PARTITION TABLE `auto_part_tbl` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT,
    `bid` int(11) DEFAULT NULL,
    `name` varchar(30) DEFAULT NULL,
    PRIMARY KEY (`id`),
    GLOBAL INDEX /* idx_name_$a870 */ `idx_name` (`name`) PARTITION BY KEY (`name`, `id`) PARTITIONS 16,
    LOCAL KEY `_local_idx_name` (`name`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8
PARTITION BY KEY(`id`)
PARTITIONS 16
/* table group = `tg108` */ |
+---------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.03 sec)

El resultado muestra lo siguiente:

  • De forma predeterminada, la tabla principal auto_part_tbl se particiona por la columna id mediante el particionamiento KEY en 16 particiones.

  • De forma predeterminada, el índice idx_name de la tabla principal es un índice global que utiliza las columnas name e id como clave de particionamiento y cuenta con 16 particiones.

Particionamiento manual

Puede crear una tabla particionada manualmente si especifica una columna de partición, una función de partición y un tipo de partición en la instrucción CREATE TABLE. Para obtener más información sobre los tipos de partición, consulte Create a partitioned table manually (AUTO mode).

Tipos de datos

Tabla 4. Tipos de datos compatibles para las columnas de clave de partición según el tipo de particionamiento

Tipo de dato

Particionamiento hash

Particionamiento por rango

Particionamiento por lista

Hash

Key

Range

Range columns

List

List columns

Columna única de clave de partición

Varias columnas de clave de partición

Tipo entero

TINYINT

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

TINYINT UNSIGNED

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

SMALLINT

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

SMALLINT UNSIGNED

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

MEDIUMINT

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

MEDIUMINT UNSIGNED

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

INT

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

INT UNSIGNED

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

BIGINT

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

BIGINT UNSIGNED

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

Tipo de punto fijo

DECIMAL

CorrectoCompatible

(No se admiten funciones de partición).

CorrectoCompatible

CorrectoCompatible

IncorrectoNo compatible

CorrectoCompatible (la escala debe ser 0 cuando se usa como clave RANGE COLUMNS).

IncorrectoNo compatible

CorrectoCompatible (la escala debe ser 0 cuando se usa como clave LIST COLUMNS).

Tipo de fecha y hora

DATE

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible (requiere una función de partición).

CorrectoCompatible

CorrectoCompatible (requiere una función de partición).

CorrectoCompatible

DATETIME

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible (requiere una función de partición).

CorrectoCompatible

CorrectoCompatible (requiere una función de partición).

CorrectoCompatible

TIMESTAMP

CorrectoCompatible

CorrectoCompatible

CorrectoCompatible

IncorrectoNo compatible

IncorrectoNo compatible

IncorrectoNo compatible

IncorrectoNo compatible

Tipo de cadena

CHAR

CorrectoCompatible (no se admiten funciones de partición).

CorrectoCompatible

CorrectoCompatible

IncorrectoNo compatible

CorrectoCompatible

IncorrectoNo compatible

CorrectoCompatible

VARCHAR

CorrectoCompatible (no se admiten funciones de partición).

CorrectoCompatible

CorrectoCompatible

IncorrectoNo compatible

CorrectoCompatible

IncorrectoNo compatible

CorrectoCompatible

Tipo binario

BINARY

CorrectoCompatible (no se admiten funciones de partición).

CorrectoCompatible

CorrectoCompatible

IncorrectoNo compatible

IncorrectoNo compatible

IncorrectoNo compatible

IncorrectoNo compatible

VARBINARY

CorrectoCompatible (no se admiten funciones de partición).

CorrectoCompatible

CorrectoCompatible

IncorrectoNo compatible

IncorrectoNo compatible

IncorrectoNo compatible

IncorrectoNo compatible

Tipos de datos de la clave de partición y enrutamiento

El enrutamiento de una tabla particionada depende directamente del tipo de dato de su clave de partición, sobre todo en las particiones key y hash. Cada tipo de dato utiliza algoritmos de hash o lógicas de comparación distintos (como la distinción entre mayúsculas y minúsculas), lo que genera comportamientos de enrutamiento diferentes. Tenga en cuenta que el enrutamiento de particiones en MySQL también depende en gran medida del tipo de dato.

En este ejemplo se muestran dos tablas, tbl_int y tbl_bigint, ambas con 1024 particiones. La tabla tbl_int usa una clave de partición int, mientras que tbl_bigint emplea una clave de partición bigint. Aunque ambos son tipos enteros, esta diferencia provoca que un mismo valor de consulta (12345678) se dirija a particiones distintas:

show create table tbl_int;
+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| TABLE   | CREATE TABLE                                                                                                                                                                |
+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tbl_int | CREATE TABLE `tbl_int` (
    `a` int(11) NOT NULL,
    KEY `auto_shard_key_a` USING BTREE (`a`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY KEY(`a`)
PARTITIONS 1024 |
+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.02 sec)

show create table tbl_bigint;
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| TABLE      | CREATE TABLE                                                                                                                                                                      |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tbl_bigint | CREATE TABLE `tbl_bigint` (
    `a` bigint(20) NOT NULL,
    KEY `auto_shard_key_a` USING BTREE (`a`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY KEY(`a`)
PARTITIONS 1024 |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.10 sec)mysql> create table if not exists tbl_bigint(a bigint not null)
    -> partition by key(a) partitions 1024;
Query OK, 0 rows affected (28.41 sec)

explain select * from tbl_int where a=12345678;
+---------------------------------------------------------------------------------------------------+
| LOGICAL EXECUTIONPLAN                                                                             |
+---------------------------------------------------------------------------------------------------+
| LogicalView(tables="tbl_int[p260]", sql="SELECT `a` FROM `tbl_int` AS `tbl_int` WHERE (`a` = ?)") |
| HitCache:false                                                                                    |
| Source:PLAN_CACHE                                                                                 |
| TemplateId: c90af636                                                                              |
+---------------------------------------------------------------------------------------------------+
4 rows in set (0.45 sec)

explain select * from tbl_bigint where a=12345678;
+------------------------------------------------------------------------------------------------------------+
| LOGICAL EXECUTIONPLAN                                                                                      |
+------------------------------------------------------------------------------------------------------------+
| LogicalView(tables="tbl_bigint[p477]", sql="SELECT `a` FROM `tbl_bigint` AS `tbl_bigint` WHERE (`a` = ?)") |
| HitCache:false                                                                                             |
| Source:PLAN_CACHE                                                                                          |
| TemplateId: 9b2fa47c                                                                                       |
+------------------------------------------------------------------------------------------------------------+
4 rows in set (0.02 sec)
            

Distinción entre mayúsculas y minúsculas, juego de caracteres y collation

Nota

El juego de caracteres y la collation de una clave de partición afectan directamente el algoritmo de enrutamiento de una tabla particionada. Por ejemplo, determinan si el enrutamiento distingue entre mayúsculas y minúsculas. Si la collation de una tabla hace esta distinción, el cálculo de hash y la comparación durante el enrutamiento también la aplican. Por el contrario, si la collation no distingue mayúsculas de minúsculas, estas operaciones tampoco lo hacen. De forma predeterminada, una clave de partición de tipo cadena utiliza el juego de caracteres utf8 y la collation utf8_general_ci, que no distingue entre mayúsculas y minúsculas.

Ejemplo 1

Para que el enrutamiento de la clave de partición distinga entre mayúsculas y minúsculas, establezca una collation que haga esta distinción al crear la tabla, como utf8_bin. En el siguiente ejemplo, la tabla tbl_varchar_cs utiliza CHARACTER SET utf8 COLLATE utf8_bin. Como resultado, dirige las cadenas 'AbcD' y 'abcd', que solo difieren en el uso de mayúsculas, a particiones distintas:

show create table tbl_varchar_cs;
+----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| TABLE          | CREATE TABLE                                                                                                                                                                                                          |
+----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tbl_varchar_cs | CREATE TABLE `tbl_varchar_cs` (
    `a` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
    KEY `auto_shard_key_a` USING BTREE (`a`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8
PARTITION BY KEY(`a`)
PARTITIONS 64 |
+----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.07 sec)

explain select a from tbl_varchar_cs where a in ('AbcD');
+-------------------------------------------------------------------------------------------------------------------------+
| LOGICAL EXECUTIONPLAN                                                                                                   |
+-------------------------------------------------------------------------------------------------------------------------+
| LogicalView(tables="tbl_varchar_cs[p29]", sql="SELECT `a` FROM `tbl_varchar_cs` AS `tbl_varchar_cs` WHERE (`a` IN(?))") |
| HitCache:false                                                                                                          |
| Source:PLAN_CACHE                                                                                                       |
| TemplateId: 2c49c244                                                                                                    |
+-------------------------------------------------------------------------------------------------------------------------+
4 rows in set (0.11 sec)

explain select a from tbl_varchar_cs where a in ('abcd');
+-------------------------------------------------------------------------------------------------------------------------+
| LOGICAL EXECUTIONPLAN                                                                                                   |
+-------------------------------------------------------------------------------------------------------------------------+
| LogicalView(tables="tbl_varchar_cs[p11]", sql="SELECT `a` FROM `tbl_varchar_cs` AS `tbl_varchar_cs` WHERE (`a` IN(?))") |
| HitCache:true                                                                                                           |
| Source:PLAN_CACHE                                                                                                       |
| TemplateId: 2c49c244                                                                                                    |
+-------------------------------------------------------------------------------------------------------------------------+
4 rows in set (0.02 sec)

Ejemplo 2

Para que el enrutamiento de la clave de partición no distinga entre mayúsculas y minúsculas, establezca una collation sin esta distinción al crear la tabla, como utf8_general_ci. En el siguiente ejemplo, la tabla tbl_varchar_ci utiliza CHARACTER SET utf8 COLLATE utf8_general_ci. Como resultado, dirige las cadenas 'AbcD' y 'abcd' a la misma partición:

show create table tbl_varchar_ci;
+----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| TABLE          | CREATE TABLE                                                                                                                                                                      |
+----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tbl_varchar_ci | CREATE TABLE `tbl_varchar_ci` (
    `a` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
    KEY `auto_shard_key_a` USING BTREE (`a`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8
PARTITION BY KEY(`a`)
PARTITIONS 64 |
+----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.06 sec)

explain select a from tbl_varchar_ci where a in ('AbcD');
+------------------------------------------------------------------------------------------------------------------------+
| LOGICAL EXECUTIONPLAN                                                                                                  |
+------------------------------------------------------------------------------------------------------------------------+
| LogicalView(tables="tbl_varchar_ci[p4]", sql="SELECT `a` FROM `tbl_varchar_ci` AS `tbl_varchar_ci` WHERE (`a` IN(?))") |
| HitCache:false                                                                                                         |
| Source:PLAN_CACHE                                                                                                      |
| TemplateId: 5c97178e                                                                                                   |
+------------------------------------------------------------------------------------------------------------------------+
4 rows in set (0.15 sec)

explain select a from tbl_varchar_ci where a in ('abcd');
+------------------------------------------------------------------------------------------------------------------------+
| LOGICAL EXECUTIONPLAN                                                                                                  |
+------------------------------------------------------------------------------------------------------------------------+
| LogicalView(tables="tbl_varchar_ci[p4]", sql="SELECT `a` FROM `tbl_varchar_ci` AS `tbl_varchar_ci` WHERE (`a` IN(?))") |
| HitCache:true                                                                                                          |
| Source:PLAN_CACHE                                                                                                      |
| TemplateId: 5c97178e                                                                                                   |
+------------------------------------------------------------------------------------------------------------------------+
4 rows in set (0.02 sec)

Cambios en el juego de caracteres y la collation

Dado que el algoritmo de enrutamiento de una tabla particionada lo determina el tipo de dato de su clave de partición, modificar el juego de caracteres o la collation de dicha clave desencadena una redistribución de todos los datos de la tabla. Por lo tanto, tenga precaución al modificar el tipo de dato de una clave de partición.

Truncamiento y conversión de tipos en columnas de partición

Truncamiento de tipos en columnas de partición

Si una constant expression en una consulta o en una instrucción INSERT supera el rango válido del tipo de dato de la partition column, PolarDB-X trunca primero el valor. Después, lo utiliza para el routing calculation.

Por ejemplo, la tabla tbl_smallint tiene una partition column de tipo smallint. Este tipo admite un rango válido de -32768 a 32767. Si intenta insertar un valor fuera de este rango, como 12345678 o -12345678, PolarDB-X trunca el valor al máximo o mínimo del tipo smallint (32767 o -32768, respectivamente). A continuación se muestra este proceso.

show create table tbl_smallint;
+--------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| TABLE        | CREATE TABLE                                                                                                                                                                        |
+--------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tbl_smallint | CREATE TABLE `tbl_smallint` (
    `a` smallint(6) NOT NULL,
    KEY `auto_shard_key_a` USING BTREE (`a`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY KEY(`a`)
PARTITIONS 128 |
+--------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.06 sec)
set sql_mode='';
Query OK, 0 rows affected (0.00 sec)

insert into tbl_smallint values (12345678),(-12345678);
Query OK, 2 rows affected (0.07 sec)

select * from tbl_smallint;
+--------+
| a      |
+--------+
| -32768 |
|  32767 |
+--------+
2 rows in set (3.51 sec)

explain select * from tbl_smallint where a=12345678;
+------------------------------------------------------------------------------------------------------------------+
| LOGICAL EXECUTIONPLAN                                                                                            |
+------------------------------------------------------------------------------------------------------------------+
| LogicalView(tables="tbl_smallint[p117]", sql="SELECT `a` FROM `tbl_smallint` AS `tbl_smallint` WHERE (`a` = ?)") |
| HitCache:false                                                                                                   |
| Source:PLAN_CACHE                                                                                                |
| TemplateId: afb464d5                                                                                             |
+------------------------------------------------------------------------------------------------------------------+
4 rows in set (0.16 sec)

explain select * from tbl_smallint where a=32767;
+------------------------------------------------------------------------------------------------------------------+
| LOGICAL EXECUTIONPLAN                                                                                            |
+------------------------------------------------------------------------------------------------------------------+
| LogicalView(tables="tbl_smallint[p117]", sql="SELECT `a` FROM `tbl_smallint` AS `tbl_smallint` WHERE (`a` = ?)") |
| HitCache:true                                                                                                    |
| Source:PLAN_CACHE                                                                                                |
| TemplateId: afb464d5                                                                                             |
+------------------------------------------------------------------------------------------------------------------+
4 rows in set (0.03 sec)

De igual forma, si un valor constante en una consulta excede el rango del tipo, PolarDB-X también lo trunca antes de enrutar. Por lo tanto, en la tabla tbl_smallint, las consultas con a=12345678 y a=32767 se dirigen a la misma partición.

Conversión de tipos en columnas de partición

Si una constant expression en una consulta o instrucción INSERT tiene un tipo de dato distinto al de la partition column, PolarDB-X aplica una implicit type conversion sobre la expresión constante. Luego usa el valor convertido para el routing calculation. Sin embargo, la type conversion puede fallar. Por ejemplo, la cadena abc no se puede convertir a un número entero.

Cuando ocurre o falla la type conversion de una partition column, PolarDB-X actúa de manera distinta según el tipo de instrucción (DQL, DML o DDL):

  • DQL (específicamente cuando la type conversion involucra una partition column dentro de una cláusula WHERE)

    • Conversión exitosa: PolarDB-X utiliza el valor convertido para el partition routing.

    • Conversión con errores: PolarDB-X ignora la condición sobre la partition column. Esto provoca un full table scan.

  • DML (en particular para instrucciones INSERT o REPLACE)

    • Conversión exitosa: PolarDB-X utiliza el valor convertido para el partition routing.

    • Conversión con errores: PolarDB-X rechaza la instrucción y devuelve un error.

  • DDL (aplica a instrucciones DDL relacionadas con partitioned tables, como CREATE TABLE y SPLIT PARTITION)

    • Conversión exitosa: PolarDB-X rechaza la instrucción y devuelve un error. Las instrucciones DDL no admiten la implicit type conversion.

    • Conversión con errores: PolarDB-X rechaza la instrucción y devuelve un error.

Diferencias de sintaxis respecto a las tablas particionadas de MySQL

Diferencia

MySQL

PolarDB-X

Inclusión de la clave primaria en la clave de partición

Obligatorio.

No es obligatorio.

Particionamiento por clave

Algoritmo de enrutamiento: operación de módulo sobre el número de particiones.

Algoritmo de enrutamiento: algoritmo de hash consistente.

Particionamiento por hash

  1. Algoritmo de enrutamiento: operación de módulo sobre el número de particiones.

  2. No es compatible con varias columnas de partición.

  3. Admite el particionamiento por hash lineal.

  4. Para una clave de partición de una sola columna, HASH(col) y KEY(col) usan algoritmos de enrutamiento distintos.

  1. Algoritmo de enrutamiento: algoritmo de hash consistente.

  2. Es compatible con varias columnas de partición (sintaxis extendida).

  3. No es compatible con el particionamiento por hash lineal.

  4. Para una clave de partición de una sola columna, HASH(col) y KEY(col) usan el mismo algoritmo de enrutamiento.

Función de particionamiento

Compatible. En PARTITION BY HASH(expr(col)), expr puede ser cualquier expresión aritmética válida, como YEAR(col) + 1.

Compatible con limitaciones. En PARTITION BY HASH(expr(col)), expr se restringe a las siguientes funciones. Además, la expresión no puede incluir operadores aritméticos como +, -, * o /:

  • YEAR

  • MONTH

  • DAYOFMONTH

  • DAYOFWEEK

  • DAYOFYEAR

  • TO_DAYS

  • TO_MONTHS

  • TO_WEEKS

  • TO_SECONDS

  • UNIX_TIMESTAMP

  • SUBSTR/SUBSTRING

Tipos de dato de las columnas de partición

El particionamiento por clave es compatible con todos los tipos de dato.

El particionamiento por clave solo admite tipos de dato enteros, de fecha y hora, y de cadena.

Juego de caracteres de la columna de partición

Admite todos los juegos de caracteres comunes.

Solo es compatible con los siguientes juegos de caracteres:

  • utf8

  • utf8mb4

  • gbk

Subparticionamiento

Compatible.

Compatible.