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 commode='auto'. ExecuteSHOW CREATE DATABASE db_namepara 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.: |
|
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.: |
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 |
|
|
Conjunto de caracteres padrão para as colunas da tabela. Valores suportados: |
|
|
Collation padrão para as colunas da tabela. Valores suportados: |
|
|
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 |
|
|
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
SUBSTReSUBSTRINGexigem 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 |
|
|
|
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 |
|
|
|
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 |
|
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)
);
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)
);
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
NULLcomo limite de intervalo.Se uma consulta especificar
NULLpara 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 |
|
|
|
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'))
);
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)
);
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.: |
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
INSERTouREPLACEem que as colunas de chave de partição de uma linha roteiam para partições diferentes é rejeitado.Um
UPDATEouUPSERTque 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-se34). Isso garante quec1 = 1000034ec2 = 34sejam 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 nantes 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 ndentro de cada cláusulaPARTITION.
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 emid.O índice
idx_nameé um GSI particionado em 16 partições por KEY emname, 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
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 |
Algoritmos diferentes |
Mesmo algoritmo |
|
Funções de partição |
Qualquer expressão em |
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 |
|
|
Partições de nível 2 (subpartições) |
Suportado |
Suportado |
Próximos passos
CREATE DATABASE — crie banco de dados lógico no modo AUTO
Criar manualmente uma tabela particionada (modo AUTO) — guia passo a passo com recomendações de design de partição
ALTER TABLEGROUP — divida partições quentes, mescle partições ou migre dados de partição