Todos os produtos
Search
Central de documentação

PolarDB:CREATE TABLE (modo AUTO)

Última atualização: Jul 04, 2026

Esta referência aborda a sintaxe CREATE TABLE para criação de tabelas particionadas em bancos de dados PolarDB-X no modo AUTO. O conteúdo inclui tipos de particionamento, parâmetros, restrições e comportamento de roteamento de dados.

Esta sintaxe aplica-se apenas a bancos de dados lógicos criados com mode='auto' . Execute SHOW CREATE DATABASE db_name para verificar o modo de um banco de dados existente.

Pré-requisitos

Antes de criar uma tabela particionada:

  • O banco de dados lógico de destino deve estar no modo AUTO. Para criar um:

    CREATE DATABASE part_db mode='auto';
  • Para usar recursos de partição de nível 2, a instância PolarDB-X deve ter a versão 5.4.17-16952556 ou posterior.

  • Se a chave primária não incluir a chave de partição e não for de incremento automático, ela deverá ser única.

Conceitos principais

Termo

Definição

Chave de partição

Uma ou mais colunas usadas para dividir horizontalmente uma tabela entre partições

Coluna de chave de partição

Coluna individual que compõe uma chave de partição

Chave de partição de coluna única

Chave de partição composta por exatamente uma coluna

Chave de partição vetorial

Chave de partição composta por duas ou mais colunas

Coluna de prefixo da chave de partição

Em uma chave de partição vetorial de N colunas, refere-se às primeiras K colunas (1 ≤ K ≤ N)

Função de partição

Função aplicada a uma coluna de chave de partição antes do roteamento. Consulte Funções de partição

Pruning de partição

Otimização de consulta que ignora partições fora da condição WHERE

Divisão de partição quente

Divisão de uma partição sobrecarregada em múltiplas partições usando outra coluna de uma chave de partição vetorial

Partição física

Partição armazenada em um nó de dados; corresponde a um shard de tabela física

Partição lógica

Partição virtual mapeada para uma ou mais partições físicas (partição de nível 1 em uma configuração de nível 2)

Escolha um tipo de particionamento

Objetivo

Tipo recomendado

Distribuir gravações uniformemente sem semântica de intervalo

KEY (padrão) ou HASH

Particionar por intervalos de data ou hora

RANGE com função de partição (ex.: YEAR, TO_DAYS)

Particionar por valores categóricos discretos

LIST ou LIST COLUMNS

Particionar por intervalos de tempo com chaves multicolumnares

RANGE COLUMNS

Particionar por múltiplas colunas com valores correlacionados (ex.: order_id e buyer_id compartilhando um sufixo)

COHASH

Adicionar uma segunda dimensão aos tipos anteriores

Partições de nível 2 (subpartições)

Sintaxe

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

Em que table_partition_definition é um dos seguintes:

SINGLE
| BROADCAST
| partition_options

E partition_options é:

partition_columns_definition
[subpartition_columns_definition]
[subpartition_specs_definition]   -- templated level-2 partitions
partition_specs_definition

Definições de coluna de chave de partição (nível 1)

PARTITION BY
    HASH({column_name | partition_func(column_name)}) PARTITIONS n
  | KEY(column_list) PARTITIONS n
  | 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 n

Definições de coluna de chave de partição (nível 2)

As mesmas opções do nível 1, exceto CO_HASH, que não é suportado:

SUBPARTITION BY
    HASH({column_name | partition_func(column_name)}) SUBPARTITIONS n
  | KEY(column_list) SUBPARTITIONS n
  | RANGE ({column_name | partition_func(column_name)})
  | RANGE COLUMNS(column_list)
  | LIST ({column_name | partition_func(column_name)})
  | LIST COLUMNS(column_list)

Índice secundário global

[UNIQUE] GLOBAL INDEX index_name [index_type] (index_sharding_col_name,...)
    [COVERING (col_name,...)]
    [partition_options]
    [VISIBLE|INVISIBLE]

Opções de tabela

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

Definição de partição local

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 {NOW() | DATE_ADD(...) | DATE_SUB(...)}]
    [DISABLE SCHEDULE]
A sintaxe DDL do PolarDB-X baseia-se no MySQL. As seções abaixo destacam as diferenças. Para a sintaxe base do MySQL, consulte a documentação do CREATE TABLE do MySQL 5.7 .

Parâmetros

Parâmetro

Descrição

CHARSET / CHARACTER SET

Conjunto de caracteres padrão para as colunas da tabela. Valores suportados: utf8, utf8mb4, gbk

COLLATE

Collation padrão para as colunas da tabela. Valores suportados: 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

Grupo de tabelas ao qual a tabela pertence. Se omitido, o PolarDB-X atribui a tabela a um grupo compatível existente ou cria um novo. Todas as tabelas de um grupo devem usar o mesmo método de particionamento

LOCALITY

Nós de dados onde a tabela está implantada

Funções de partição

É possível usar as funções a seguir em PARTITION BY HASH(...), PARTITION BY RANGE(...) e PARTITION BY LIST(...) para transformar o valor de uma coluna antes do roteamento:

YEAR · MONTH · DAYOFMONTH · DAYOFWEEK · DAYOFYEAR · TO_DAYS · TO_MONTHS · TO_WEEKS · TO_SECOND · UNIX_TIMESTAMP · SUBSTR / SUBSTRING · RIGHT · LEFT

  • SUBSTR e SUBSTRING exigem uma coluna STRING.

  • As demais funções exigem uma coluna DATE, DATETIME ou TIMESTAMP.

  • Não há suporte a funções aninhadas (ex.: SUBSTR(SUBSTR(c1,-6),-4)).

Tabelas não particionadas

Use a palavra-chave SINGLE para criar uma tabela não distribuída entre partições:

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

Tabelas broadcast

Use a palavra-chave BROADCAST para replicar uma tabela em todos os nós de dados. Esse recurso é útil para pequenas tabelas de referência frequentemente unidas (joined) a grandes tabelas particionadas:

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

Tabelas particionadas

Particionamento HASH e KEY

Ambos os tipos distribuem dados usando o algoritmo de hash consistente MurmurHash3 nativo do PolarDB-X. A distribuição torna-se equilibrada quando a chave de partição possui mais de 3.000 valores distintos.

Os dois tipos diferem no tratamento de chaves de partição multicolumnares:

**KEY partitioning**

**HASH partitioning**

Sintaxe

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

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

Chave de coluna única

Suportado

Suportado

Chave de partição vetorial

Suportado (roteia pelas primeiras K colunas; outras colunas disponíveis para divisão de partição quente)

Suportado (roteia por todas as colunas simultaneamente; divisão de partição quente indisponível)

Funções de partição

Não suportado

Suportado para chaves de coluna única

Tipo padrão

Sim — KEY é o padrão

Não

Exemplo: Particionamento KEY (recomendado para a maioria dos casos)

Crie uma tabela particionada por name e id. Por padrão, o roteamento usa apenas a coluna name, deixando id disponível para futura divisão de partição quente:

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;

Para acionar o pruning de partição, inclua a primeira coluna de roteamento na cláusula WHERE:

-- Scans only one partition
SELECT id FROM key_tbl WHERE name = 'Jack';

Se a coluna name apresentar um ponto de congestionamento (hot spot), use ALTER TABLEGROUP para dividir com base na coluna id. Para detalhes, consulte ALTER TABLEGROUP.

Exemplo: Particionamento HASH (coluna única)

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;

Para particionar por uma coluna datetime, use uma função de partição para convertê-la em inteiro:

CREATE TABLE hash_tbl_days(
  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;

Exemplo: Particionamento HASH (chave vetorial)

O PolarDB-X estende o particionamento HASH para suportar chaves de partição vetoriais (recurso indisponível no MySQL). Diferentemente do particionamento KEY, o roteamento usa todas as colunas da chave simultaneamente. Portanto, o pruning de partição exige condições em todas elas:

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;
-- Partition pruning: scans one partition (all key columns specified)
SELECT id FROM hash_tbl2 WHERE name = 'Jack' AND birthday = '1990-11-11';

-- No pruning: scans all partitions (incomplete key)
SELECT id FROM hash_tbl2 WHERE name = 'Jack';

Quando usar

  • KEY partitioning — escolha padrão para distribuição uniforme de dados, com opção de dividir partições quentes posteriormente.

  • HASH com função de partição — ideal para distribuir linhas por componente de tempo (ex.: ano, mês) em vez do timestamp bruto.

  • HASH com chave vetorial — indicado quando as linhas devem ser roteadas pelo valor combinado de múltiplas colunas e não há necessidade de dividir partições quentes.

Limitações

Tipos de dados

Inteiro: BIGINT, BIGINT UNSIGNED, INT, INT UNSIGNED, MEDIUMINT, MEDIUMINT UNSIGNED, SMALLINT, SMALLINT UNSIGNED, TINYINT, TINYINT UNSIGNED

Data/hora: DATE, DATETIME, TIMESTAMP

String: CHAR, VARCHAR

Restrições de sintaxe

  • Chaves de coluna única com coluna DATE, DATETIME ou TIMESTAMP podem usar funções de partição.

  • Chaves de partição vetoriais não suportam funções de partição nem divisão de partição quente.

  • Por padrão, uma tabela pode ter no máximo 8.192 partições.

  • Uma chave de partição pode ter no máximo 5 colunas.

Particionamento RANGE e RANGE COLUMNS

Ambos os tipos roteiam dados comparando o valor da chave de partição com limites predefinidos. Use RANGE COLUMNS quando a chave contiver múltiplas colunas ou strings; use RANGE quando precisar aplicar uma função de partição em uma única coluna de data/hora.

**RANGE COLUMNS**

**RANGE**

Sintaxe

PARTITION BY RANGE COLUMNS(c1, ..., cn)

PARTITION BY RANGE(expr(c1))

Chave de partição vetorial

Suportado

Não suportado

Funções de partição

Não suportado

Suportado

Colunas TIMESTAMP

Não suportado como chave de partição

Não suportado diretamente; use UNIX_TIMESTAMP()

Colunas String

Suportado

Não suportado

Divisão de partição quente

Suportado

Não suportado

Algoritmo de roteamento

Busca binária

Busca binária

Exemplo: Particionamento RANGE COLUMNS

Particione uma tabela de pedidos por intervalos de order_id e order_time:

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

RANGE COLUMNS não suporta colunas TIMESTAMP ou TIME como chaves de partição.

Exemplo: Particionamento RANGE

Particione por trimestre usando TO_DAYS() para converter order_time em inteiro:

CREATE TABLE orders_quarterly(
  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

O particionamento RANGE exige coluna de chave de partição inteira. Não há suporte a colunas string. Para usar coluna TIMESTAMP, aplique UNIX_TIMESTAMP().

Quando usar

  • RANGE COLUMNS — ideal para particionamento por intervalo de datas ou IDs com chaves multicolumnares ou requisitos de divisão de partição quente.

  • RANGE — adequado para particionamento baseado em data de coluna única com uso de função de extração de tempo.

Limitações

Tipos de dados

Inteiro: BIGINT, BIGINT UNSIGNED, INT, INT UNSIGNED, MEDIUMINT, MEDIUMINT UNSIGNED, SMALLINT, SMALLINT UNSIGNED, TINYINT, TINYINT UNSIGNED

Data/hora: DATE, DATETIME (TIMESTAMP não suportado em RANGE COLUMNS; use UNIX_TIMESTAMP() em RANGE)

String: CHAR, VARCHAR (apenas RANGE COLUMNS; não suportado em RANGE)

Restrições de sintaxe

  • Não use NULL como limite de intervalo.

  • Se uma consulta especificar NULL para chave de partição RANGE, o PolarDB-X tratará o NULL como valor mínimo durante o roteamento.

  • Por padrão, uma tabela pode ter no máximo 8.192 partições.

  • Uma chave de partição pode ter no máximo 5 colunas.

Particionamento LIST e LIST COLUMNS

Ambos os tipos roteiam cada linha para a partição cuja lista de valores contém o valor da chave de partição. Essa abordagem é adequada para distribuir dados por categoria (região, status, tenant).

**LIST COLUMNS**

**LIST**

Sintaxe

PARTITION BY LIST COLUMNS(c1, ..., cn)

PARTITION BY LIST(expr(c1))

Chave de partição vetorial

Suportado

Não suportado

Funções de partição

Não suportado

Suportado

Colunas TIMESTAMP

Não suportado

Não suportado diretamente

Colunas String

Suportado

Não suportado

Partição DEFAULT

Suportado

Suportado

Divisão de partição quente

Não suportado

Não suportado

Exemplo: Particionamento LIST COLUMNS

Particione uma tabela regional de pedidos por país e cidade:

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

LIST COLUMNS não suporta colunas TIMESTAMP ou TIME como chaves de partição.

Exemplo: Particionamento LIST

Particione por ano usando YEAR() para extrair um inteiro de order_time:

CREATE TABLE orders_by_year(
  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

O particionamento LIST exige colunas de chave de partição inteiras. Não há suporte a colunas string.

Exemplo: Partição DEFAULT (LIST COLUMNS)

Adicione uma partição DEFAULT para capturar linhas sem correspondência em outras partições. Apenas uma partição DEFAULT é permitida, e ela deve ser definida por último:

CREATE TABLE orders_region_default(
  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)
);

Exemplo: Partição DEFAULT (LIST)

O particionamento LIST também suporta partição DEFAULT para rotear valores inteiros sem correspondência:

CREATE TABLE orders_by_year_default(
  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)
);

Quando usar

  • LIST COLUMNS — projetado para particionamento categórico em colunas string (ex.: país, região) ou múltiplas colunas.

  • LIST — indicado para particionamento categórico em coluna inteira única ou derivada de tempo.

  • Adicione uma DEFAULT partition caso novos valores de categoria possam surgir após a criação da tabela.

Limitações

Tipos de dados

Inteiro: BIGINT, BIGINT UNSIGNED, INT, INT UNSIGNED, MEDIUMINT, MEDIUMINT UNSIGNED, SMALLINT, SMALLINT UNSIGNED, TINYINT, TINYINT UNSIGNED

Data/hora: DATE, DATETIME

String: CHAR, VARCHAR (apenas LIST COLUMNS)

Restrições de sintaxe

  • LIST COLUMNS não suporta colunas TIMESTAMP.

  • O particionamento LIST exige colunas de chave de partição inteiras.

  • Nenhum dos tipos suporta divisão de partição quente.

  • Por padrão, uma tabela pode ter no máximo 8.192 partições.

  • Uma chave de partição pode ter no máximo 5 colunas.

Particionamento COHASH

COHASH é um tipo de particionamento exclusivo do PolarDB-X para tabelas em que duas ou mais colunas sempre compartilham sufixo ou prefixo comum. Por exemplo, order_id e buyer_id sempre têm os mesmos seis últimos dígitos. O COHASH particiona a tabela de modo que consultas equivalentes em qualquer dessas colunas sejam roteadas para a mesma partição.

Versão mínima: 5.4.18-17047709

Como funciona

O COHASH aplica uma função de partição (como RIGHT, LEFT ou SUBSTR) a cada coluna de chave de partição para extrair a parte compartilhada e, em seguida, usa hash consistente no resultado. Como a parte compartilhada é idêntica entre as colunas, as linhas caem na mesma partição independentemente da coluna consultada.

Exemplo: Particionamento COHASH

Particione uma tabela de pedidos pelos últimos seis caracteres de order_id e buyer_id:

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),  -- last six characters of order_id
  RIGHT(buyer_id, 6)   -- last six characters of buyer_id
)
PARTITIONS 8;

Quando order_id e buyer_id compartilham os mesmos seis últimos caracteres, ambas as consultas a seguir são roteadas para a mesma partição:

SELECT * FROM t_orders WHERE order_id = 100234;
SELECT * FROM t_orders WHERE buyer_id = 100234;

Migração do RANGE_HASH do PolarDB-X 1.0

Se a instância de origem usar RANGE_HASH(order_id, buyer_id, 6), utilize a mesma sintaxe no banco de dados de destino. O PolarDB-X converte automaticamente para a definição equivalente CO_HASH:

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;

COHASH vs KEY vs HASH

**CO_HASH**

**KEY**

**HASH**

Chave de coluna única

Não suportado

Suportado

Suportado

Chave de partição vetorial

Suportado

Suportado

Suportado

Funções de partição em colunas de chave vetorial

Suportado (ex.: RIGHT(c1,4))

Não suportado

Não suportado

Pruning de partição em qualquer coluna chave

Suportado — cada coluna roteia independentemente

Suportado apenas em colunas de prefixo

Suportado apenas em todas as colunas juntas

Divisão de partição quente

Não suportado

Suportado

Não suportado

Notas de uso

  • Você é responsável por manter a similaridade das colunas. O PolarDB-X verifica os resultados de roteamento, mas não impõe que a parte similar designada seja idêntica entre as colunas. Se uma linha inserida tiver valores diferentes na parte similar, ela poderá ser roteada silenciosamente para uma partição inesperada.

  • Restrições de DML. Para evitar roteamento inconsistente:

    • Um INSERT ou REPLACE em que as colunas de chave de partição de uma linha roteiam para partições diferentes é rejeitado.

    • Um UPDATE ou UPSERT que modifica colunas de chave de partição deve atualizar todas elas. Se os novos valores rotearem para partições diferentes, a instrução será rejeitada.

    • As mesmas restrições aplicam-se a DML na tabela primária quando a tabela possui índice secundário global (GSI) COHASH.

  • Zeros à esquerda em colunas inteiras. Ao aplicar função de partição como RIGHT(c1, 4) a coluna inteira, o resultado é automaticamente convertido para valor numérico (ex.: '0034' torna-se 34). Isso garante que c1 = 1000034 e c2 = 34 sejam roteados para a mesma partição conforme esperado.

Quando usar

Use COHASH quando uma tabela tiver duas ou mais colunas cujos valores estejam sempre correlacionados por sufixo ou prefixo compartilhado, e você precise que consultas pontuais equivalentes em qualquer dessas colunas atinjam uma única partição.

Limitações

Funções de partição: apenas RIGHT, LEFT, SUBSTR. Não há suporte a funções aninhadas.

Tipos de dados: BIGINT, INT, MEDIUMINT, SMALLINT, TINYINT (e variantes UNSIGNED); DECIMAL (parte decimal deve ser zero); CHAR, VARCHAR. Tipos de data/hora não são suportados.

Restrições de sintaxe

  • Todas as colunas de chave de partição devem compartilhar o mesmo conjunto de caracteres, collation e definição de comprimento/precisão.

  • Ao usar a sintaxe RANGE_HASH, o valor de comprimento deve ser positivo.

  • Por padrão, uma tabela pode ter no máximo 8.192 partições.

  • Uma chave de partição pode ter no máximo 5 colunas.

Partições de nível 2 (subpartições)

Partições de nível 2 adicionam uma segunda dimensão de particionamento a cada partição de nível 1. As partições de nível 1 tornam-se lógicas; cada subpartição de nível 2 é uma partição física em um nó de dados.

Recursos de partição de nível 2 exigem PolarDB-X versão 5.4.17-16952556 ou posterior.

Subpartições com modelo vs sem modelo

  • Com modelo (Templated): cada partição de nível 1 recebe o mesmo número e limite de subpartições. Defina usando SUBPARTITION BY ... SUBPARTITIONS n antes da lista de partições.

  • Sem modelo (Non-templated): cada partição de nível 1 pode ter número diferente de subpartições. Defina especificando SUBPARTITIONS n dentro de cada cláusula PARTITION.

Exemplo: Subpartições com modelo

Três partições de nível 1 LIST COLUMNS, cada uma com quatro subpartições KEY — 12 partições físicas no total:

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 (('Russia', 'Moscow')),
  PARTITION pd VALUES IN (DEFAULT)
);

Exemplo: Subpartições sem modelo

Três partições de nível 1 LIST COLUMNS com 2, 3 e 4 subpartições respectivamente — 9 partições físicas no total:

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
);

Quando usar

Use partições de nível 2 quando estratégia unidimensional levar a distorção de dados ou granularidade insuficiente. Por exemplo, particione pedidos por região (LIST) e depois por ID dentro de cada região (KEY).

Limitações

  • O total de partições físicas (soma de todas as partições de nível 2 em todas as de nível 1) não pode exceder 8.192 por padrão.

  • Nomes de subpartições devem ser únicos e não podem duplicar nomes de partição de nível 1.

  • Mantenha baixo o produto das contagens de nível 1 e nível 2 para evitar sobrecarga excessiva de partições.

Particionamento automático

Por padrão, o particionamento automático fica desativado em bancos de dados no modo AUTO. Para ativá-lo:

SET GLOBAL AUTO_PARTITION = true;

Com o particionamento automático ativado, instruções CREATE TABLE sem chave de partição explícita usam particionamento KEY na chave primária. A contagem padrão de partições é: número de nós lógicos × 8. Para instância de 2 nós, isso resulta em 16 partições.

Todos os índices secundários em tabela particionada automaticamente são criados como índices secundários globais (GSIs), particionados pela coluna de chave do índice e pela coluna de chave primária.

Exemplo

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

SHOW CREATE TABLE retorna sintaxe padrão compatível com MySQL sem detalhes de partição:

SHOW CREATE TABLE auto_part_tbl;
| 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 |

SHOW FULL CREATE TABLE retorna a definição completa da partição:

SHOW FULL CREATE TABLE auto_part_tbl;
| 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
/* tablegroup = `tg108` */ |

A saída mostra:

  • A tabela primária (auto_part_tbl) está particionada em 16 partições por KEY em id.

  • O índice idx_name é um GSI particionado em 16 partições por KEY em name, id.

Para chaves de partição especificadas manualmente, consulte Criar manualmente uma tabela particionada (modo AUTO).

Tipos de dados suportados

A tabela abaixo lista os tipos de dados suportados como colunas de chave de partição para cada tipo de particionamento.

Tipo de dado

HASH

KEY

RANGE

RANGE COLUMNS

LIST

LIST COLUMNS

Inteiro (TINYINT a BIGINT, com e sem sinal)

Suportado

Suportado

Suportado

Suportado

Suportado

Suportado

DECIMAL

Suportado (sem funções de partição; parte decimal deve ser zero para RANGE COLUMNS e LIST COLUMNS)

Suportado

Não suportado

Suportado (parte decimal deve ser zero)

Não suportado

Suportado (parte decimal deve ser zero)

DATE

Suportado (funções de partição suportadas)

Suportado

Suportado (função de partição obrigatória)

Suportado

Suportado (função de partição obrigatória)

Suportado

DATETIME

Suportado (funções de partição suportadas)

Suportado

Suportado (funções de partição suportadas)

Suportado

Suportado (funções de partição suportadas)

Suportado

TIMESTAMP

Suportado (funções de partição suportadas)

Suportado

Não suportado

Não suportado

Não suportado

Não suportado

CHAR

Suportado (sem funções de partição)

Suportado

Não suportado

Suportado

Não suportado

Suportado

VARCHAR

Suportado (sem funções de partição)

Suportado

Não suportado

Suportado

Não suportado

Suportado

BINARY

Suportado (sem funções de partição)

Suportado

Não suportado

Não suportado

Não suportado

Não suportado

VARBINARY

Suportado (sem funções de partição)

Suportado

Não suportado

Não suportado

Não suportado

Não suportado

Comportamento de roteamento de dados

Efeito do tipo de dados no roteamento

O tipo de dados da chave de partição determina o algoritmo de hash ou comparação. Duas tabelas particionadas no mesmo valor, mas com tipos de coluna diferentes (ex.: INT vs BIGINT), roteiam esse valor para partições diferentes:

EXPLAIN SELECT * FROM tbl_int    WHERE a = 12345678;
-- LogicalView(tables="tbl_int[p260]", ...)

EXPLAIN SELECT * FROM tbl_bigint WHERE a = 12345678;
-- LogicalView(tables="tbl_bigint[p477]", ...)

Efeito do conjunto de caracteres e collation no roteamento

A collation de coluna de chave de partição string determina se o roteamento diferencia maiúsculas de minúsculas:

  • Collation sensível a maiúsculas/minúsculas (ex.: utf8_bin): 'AbcD' e 'abcd' roteiam para partições diferentes.

  • Collation insensível a maiúsculas/minúsculas (ex.: utf8_general_ci): 'AbcD' e 'abcd' roteiam para a mesma partição.

Por padrão, colunas de chave de partição string usam utf8_general_ci (insensível a maiúsculas/minúsculas).

Exemplo: Roteamento sensível a maiúsculas/minúsculas

-- tbl_varchar_cs uses utf8_bin
EXPLAIN SELECT a FROM tbl_varchar_cs WHERE a IN ('AbcD');
-- LogicalView(tables="tbl_varchar_cs[p29]", ...)

EXPLAIN SELECT a FROM tbl_varchar_cs WHERE a IN ('abcd');
-- LogicalView(tables="tbl_varchar_cs[p11]", ...)  -- different partition

Exemplo: Roteamento insensível a maiúsculas/minúsculas

-- tbl_varchar_ci uses utf8_general_ci
EXPLAIN SELECT a FROM tbl_varchar_ci WHERE a IN ('AbcD');
-- LogicalView(tables="tbl_varchar_ci[p4]", ...)

EXPLAIN SELECT a FROM tbl_varchar_ci WHERE a IN ('abcd');
-- LogicalView(tables="tbl_varchar_ci[p4]", ...)   -- same partition
Importante

Alterar o conjunto de caracteres ou a collation de coluna de chave de partição aciona redistribuição completa dos dados entre as partições. Planeje essa alteração com cuidado.

Truncamento de valor

Quando valor de chave de partição em consulta ou instrução DML excede o intervalo válido do tipo de dados da coluna, o PolarDB-X trunca-o para o valor limite e roteia com base no valor truncado.

Para coluna SMALLINT (intervalo: –32.768 a 32.767):

INSERT INTO tbl_smallint VALUES (12345678), (-12345678);
-- Stored as 32767 and -32768

SELECT * FROM tbl_smallint WHERE a = 12345678;
-- Routes to the same partition as WHERE a = 32767

Conversão de tipo de dados

Quando o tipo de constante de consulta difere do tipo da coluna de chave de partição, o PolarDB-X tenta conversão implícita antes do roteamento:

  • DQL — se a conversão falhar, a condição da chave de partição é ignorada e todas as partições são verificadas.

  • DML (INSERT, REPLACE) — se a conversão falhar, a instrução é rejeitada com erro.

  • DDL (CREATE TABLE, ALTER TABLE) — não há suporte a conversão de tipo; a instrução é rejeitada.

Diferenças entre PolarDB-X e MySQL

Recurso

MySQL

PolarDB-X

Chave de partição deve incluir chave primária

Obrigatório

Não obrigatório

Roteamento de particionamento KEY

Módulo pela contagem de partições

Hash consistente (MurmurHash3)

Roteamento de particionamento HASH

Módulo pela contagem de partições

Hash consistente (MurmurHash3)

Chave de partição HASH multicolumnar

Não suportado

Suportado (sintaxe estendida)

LINEAR HASH

Suportado

Não suportado

Roteamento HASH(col) vs KEY(col) (coluna única)

Algoritmos diferentes

Mesmo algoritmo

Funções de partição

Qualquer expressão em PARTITION BY HASH(expr(col))

Limitado a funções específicas (consulte Funções de partição)

Tipos de coluna de particionamento KEY

Todos os tipos

Apenas tipos inteiros, data/hora e string

Conjuntos de caracteres suportados

Todos os conjuntos comuns

utf8, utf8mb4, gbk

Partições de nível 2 (subpartições)

Suportado

Suportado

Próximos passos