Todos os produtos
Search
Central de documentação

PolarDB:Sharding automático por chave primária no modo AUTO

Última atualização: Jun 28, 2026

Ao criar um banco de dados no modo de particionamento automático, o PolarDB-X aplica sharding às tabelas pela chave primária por padrão, sem exigir palavras-chave de particionamento. Isso permite usar a sintaxe padrão CREATE TABLE, enquanto o PolarDB-X seleciona automaticamente a chave de shard e o algoritmo de sharding.

Este tópico aborda as regras de sharding automático, as regras de conversão de índices e as restrições de DDL para tabelas com sharding automático por chave primária.

Pré-requisitos

Antes de começar, verifique se:

  • A versão do PolarDB-X é 5.4.13 ou posterior

  • O banco de dados foi criado com MODE = auto ou MODE = partitioning (consulte CREATE DATABASE)

Funcionamento do sharding automático

O PolarDB-X utiliza o particionamento KEY para tabelas com sharding automático. Durante a criação da tabela, o sistema inspeciona as colunas da chave primária, ignora colunas com tipos de dados não suportados e usa as colunas restantes como chaves de shard, sem necessidade de configuração adicional.

Seleção da chave de shard

Tipo de chave primária

Chave de shard utilizada

Sem chave primária

Chave primária implícita (_drds_implicit_id_): coluna de incremento automático BIGINT, invisível aos usuários. Execute show full create table para visualizá-la.

Chave primária de coluna única

Coluna da chave primária

Chave primária composta

Todas as colunas da chave composta (o sistema ignora colunas com tipos de dados não suportados)

Tipos de dados suportados

O PolarDB-X aplica o particionamento KEY apenas a colunas com tipos de dados suportados. Se uma coluna tiver um tipo não suportado, o sistema a ignora ao construir a chave de shard.

Tipos suportados (particionamento KEY):

Tipos inteiros (tinyint, smallint, mediumint, int, bigint e suas variantes unsigned), date, datetime, timestamp, char, varchar

Tipos não suportados (inelegíveis para sharding automático):

bit, float, double, time, year, tinyblob, blob, mediumblob, longblob, enum, decimal, binary, varbinary, tinytext, text, mediumtext, longtext, set, geometry

Comportamento de chave composta: O PolarDB-X ignora colunas com tipos não suportados na chave composta. No entanto, se a primeira coluna da chave composta possuir um tipo não suportado, o sistema reportará um erro. Nesse caso, crie manualmente a tabela como tabela única. Consulte Criar uma tabela não particionada e uma tabela broadcast.

Observações de uso

  • Especifique a tabela como única ou replicada durante a criação, se necessário. Por padrão, todas as tabelas são particionadas com sharding por chave primária.

  • Defina uma chave primária ao criar a tabela. Após a criação, não é possível adicionar ou remover a chave primária.

  • Se nenhuma chave primária for especificada, o PolarDB-X criará automaticamente uma chave primária implícita (_drds_implicit_id_). Execute show full create table para visualizar os detalhes do sharding.

  • Os índices em tabelas com sharding automático tornam-se, por padrão, índices secundários globais (GSIs), a menos que o tipo de dados da primeira coluna não seja suportado ou que você especifique explicitamente LOCAL.

  • Os nomes dos GSIs no modo de particionamento automático são opcionais e não precisam ser únicos nas instruções CREATE TABLE. O PolarDB-X atribui sufixos aleatórios a todas as tabelas de GSI. Execute show full create table para visualizá-los.

  • Após alterar a regra de sharding de uma tabela com sharding automático, ela passa a ser uma tabela padrão. As regras de sharding automático e de conversão de índices deixam de ser aplicadas. Consulte Alterar o tipo e modifique a regra de particionamento de uma tabela.

Sintaxe e exemplos

O sharding automático está ativado por padrão. Nenhuma palavra-chave especial é necessária durante a criação da tabela. Para a sintaxe completa do CREATE TABLE, consulte CREATE TABLE.

Use show create table para visualizar o esquema simplificado e show full create table para visualizar o esquema completo, incluindo os detalhes de particionamento.

Exemplo 1: Chave primária composta

A tabela tb possui uma chave primária composta (x, y, z, d). Como z é do tipo float (não suportado), o PolarDB-X utiliza x, y e d como chave de shard.

CREATE TABLE `tb` (
  `x` int NOT NULL AUTO_INCREMENT,
  `y` int NOT NULL,
  `z` float NOT NULL,
  `d` int NOT NULL,
  PRIMARY KEY (x,y,z,d)
);
Query OK, 0 rows affected (0.42 sec)
show create table tb;
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| TABLE | CREATE TABLE                                                                                                                                                                                                                                                              |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tb    | CREATE TABLE `tb` (
        `x` int(11) NOT NULL AUTO_INCREMENT,
        `y` int(11) NOT NULL,
        `z` float NOT NULL,
        `d` int(11) NOT NULL,
        PRIMARY KEY (`x`, `y`, `z`, `d`),
        LOCAL KEY `auto_shard_key_x_y_d` USING BTREE (`x`, `y`, `d`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

show full create table tb;
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| TABLE | CREATE TABLE                                                                          |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tb    | CREATE PARTITION TABLE `tb` (
        `x` int(11) NOT NULL AUTO_INCREMENT,
        `y` int(11) NOT NULL,
        `z` float NOT NULL,
        `d` int(11) NOT NULL,
        PRIMARY KEY (`x`, `y`, `z`, `d`),
        LOCAL KEY `auto_shard_key_x_y_d` USING BTREE (`x`, `y`, `d`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY KEY(`x`,`y`,`d`)
PARTITIONS 16
/* tablegroup = `tg8` */ |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

Exemplo 2: Chave primária única com índices

A tabela t_order possui uma chave primária única do tipo int chamada x. O PolarDB-X aplica sharding em x e converte automaticamente ambos os índices para GSIs.

CREATE TABLE `t_order` (
  `x` int NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `order_id` varchar(20) DEFAULT NULL,
  `seller_id` varchar(20) DEFAULT NULL,
  INDEX (`seller_id`),
  UNIQUE INDEX (`order_id`)
);
Query OK, 0 rows affected (0.84 sec)
show create table `t_order`;
+---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| TABLE   | CREATE TABLE                                                                                                                                                                                                                                                             |
+---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t_order | CREATE TABLE `t_order` (
        `x` int(11) NOT NULL AUTO_INCREMENT,
        `order_id` varchar(20) DEFAULT NULL,
        `seller_id` varchar(20) DEFAULT NULL,
        PRIMARY KEY (`x`),
        INDEX `i_0` (`seller_id`),
        UNIQUE INDEX `i_1` (`order_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 |
+---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

show full create table `t_order`;
+---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| TABLE   | CREATE TABLE          |
+---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t_order | CREATE PARTITION TABLE `t_order` (
        `x` int(11) NOT NULL AUTO_INCREMENT,
        `order_id` varchar(20) DEFAULT NULL,
        `seller_id` varchar(20) DEFAULT NULL,
        PRIMARY KEY (`x`),
        GLOBAL INDEX /* i_0_$cff4 */ `i_0` (`seller_id`) PARTITION BY KEY (`seller_id`, `x`) PARTITIONS 16,
        UNIQUE GLOBAL INDEX /* i_1_$1782 */ `i_1` (`order_id`) PARTITION BY KEY (`order_id`) PARTITIONS 16,
        UNIQUE LOCAL KEY `_local_i_1` (`order_id`),
        LOCAL KEY `_local_i_0` (`seller_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY KEY(`x`)
PARTITIONS 16
/* tablegroup = `tg8` */ |
+---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

Regras de conversão de índices

Por padrão, os índices em tabelas com sharding automático tornam-se GSIs. Especifique LOCAL explicitamente para criar um índice local.

Regra principal: Os índices tornam-se GSI por padrão, a menos que você especifique LOCAL.

Palavra-chave utilizada

Índice realmente criado

[UNIQUE] LOCAL INDEX

Índice local

[UNIQUE] INDEX (sem tipo especificado)

GSI, com sharding baseado nas regras de sharding automático

[UNIQUE] GLOBAL INDEX

GSI

[UNIQUE] CLUSTERED INDEX

GSI clusterizado

Regras adicionais:

  • Ao gerar um algoritmo de sharding para um GSI, o PolarDB-X utiliza todas as colunas da chave do índice. Para índices não UNIQUE, a chave primária também é incluída como parâmetro de sharding.

  • Caso nenhuma chave de shard seja especificada para um GSI ou índice clusterizado, o PolarDB-X aplica as regras de sharding automático à chave do índice.

  • A criação de um GSI ou índice clusterizado também gera automaticamente um índice local correspondente com o prefixo _local_. A exclusão do GSI remove automaticamente o índice local associado.

O exemplo a seguir cria uma tabela com todos os tipos de índices suportados:

CREATE PARTITION TABLE `t_order` (
  `x` int,
  `order_id` varchar(20) DEFAULT NULL,
  `seller_id` varchar(20) DEFAULT NULL,
  LOCAL INDEX `l_seller` using btree (`seller_id`),         -- Local index
  UNIQUE LOCAL INDEX `l_order` using btree (`order_id`),    -- Unique local index
  INDEX `i_seller` using btree (`seller_id`),               -- GSI (auto-sharded)
  UNIQUE INDEX `i_order` using btree (`order_id`),          -- Unique GSI (auto-sharded)
  GLOBAL INDEX `g_seller` using btree (`seller_id`),        -- GSI (auto-sharded)
  UNIQUE GLOBAL INDEX `g_order` using btree (`order_id`),   -- Unique GSI (auto-sharded)
  CLUSTERED INDEX `c_seller` using btree (`seller_id`),     -- Clustered GSI (auto-sharded)
  UNIQUE CLUSTERED INDEX `c_order` using btree (`order_id`) -- Unique clustered GSI (auto-sharded)
);
Query OK, 0 rows affected (1.49 sec)

show create table `t_order`;
+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| TABLE   | CREATE TABLE                              |
+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t_order | CREATE TABLE `t_order` (
        `x` int(11) DEFAULT NULL,
        `order_id` varchar(20) DEFAULT NULL,
        `seller_id` varchar(20) DEFAULT NULL,
        UNIQUE CLUSTERED INDEX `c_order` USING BTREE (`order_id`),
        CLUSTERED INDEX `c_seller` USING BTREE (`seller_id`),
        UNIQUE INDEX `g_order` USING BTREE (`order_id`),
        INDEX `g_seller` USING BTREE (`seller_id`),
        UNIQUE INDEX `i_order` USING BTREE (`order_id`),
        INDEX `i_seller` USING BTREE (`seller_id`),
        UNIQUE LOCAL KEY `l_order` USING BTREE (`order_id`),
        LOCAL KEY `l_seller` USING BTREE (`seller_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 |
+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

show full create table `t_order`;
+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| TABLE   | CREATE TABLE                                                                                                                                                                                                  |
+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t_order | CREATE PARTITION TABLE `t_order` (
        `x` int(11) DEFAULT NULL,
        `order_id` varchar(20) DEFAULT NULL,
        `seller_id` varchar(20) DEFAULT NULL,
        `_drds_implicit_id_` bigint(20) NOT NULL AUTO_INCREMENT,
        PRIMARY KEY (`_drds_implicit_id_`),
        UNIQUE CLUSTERED INDEX /* c_order_$1ba0 */ `c_order` USING BTREE (`order_id`) PARTITION BY KEY (`order_id`) PARTITIONS 16,
        CLUSTERED INDEX /* c_seller_$1e39 */ `c_seller` USING BTREE (`seller_id`) PARTITION BY KEY (`seller_id`, `_drds_implicit_id_`) PARTITIONS 16,
        UNIQUE GLOBAL INDEX /* g_order_$d57f */ `g_order` USING BTREE (`order_id`) PARTITION BY KEY (`order_id`) PARTITIONS 16,
        GLOBAL INDEX /* g_seller_$6ed5 */ `g_seller` USING BTREE (`seller_id`) PARTITION BY KEY (`seller_id`, `_drds_implicit_id_`) PARTITIONS 16,
        UNIQUE GLOBAL INDEX /* i_order_$ab2f */ `i_order` USING BTREE (`order_id`) PARTITION BY KEY (`order_id`) PARTITIONS 16,
        GLOBAL INDEX /* i_seller_$2b4b */ `i_seller` USING BTREE (`seller_id`) PARTITION BY KEY (`seller_id`, `_drds_implicit_id_`) PARTITIONS 16,
        UNIQUE LOCAL KEY `l_order` USING BTREE (`order_id`),
        UNIQUE LOCAL KEY `_local_i_order` USING BTREE (`order_id`),
        UNIQUE LOCAL KEY `_local_g_order` USING BTREE (`order_id`),
        UNIQUE LOCAL KEY `_local_c_order` USING BTREE (`order_id`),
        LOCAL KEY `l_seller` USING BTREE (`seller_id`),
        LOCAL KEY `_local_i_seller` USING BTREE (`seller_id`),
        LOCAL KEY `_local_g_seller` USING BTREE (`seller_id`),
        LOCAL KEY `_local_c_seller` USING BTREE (`seller_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY KEY(`_drds_implicit_id_`)
PARTITIONS 16
/* tablegroup = `tg11` */ |
+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

Restrições de DDL

As seguintes restrições aplicam-se a operações de DDL em tabelas com sharding automático.

CREATE INDEX

Cláusula

Comportamento

[UNIQUE] LOCAL INDEX

Cria um índice local e o adiciona ao índice clusterizado da tabela

[UNIQUE] INDEX

Cria um GSI e um índice local correspondente com prefixo _local_, ambos adicionados ao índice clusterizado. Se nenhuma chave de shard for especificada, as regras de sharding automático serão aplicadas.

[UNIQUE] GLOBAL INDEX ou [UNIQUE] CLUSTERED INDEX

Cria o GSI ou índice clusterizado, além de um índice local com prefixo _local_ adicionado ao índice clusterizado. Se nenhuma chave de shard for especificada, as regras de sharding automático serão aplicadas.

ALTER TABLE

Cláusula

Restrição

`ADD {INDEX

KEY}`

Aplicam-se as mesmas regras de conversão do CREATE INDEX

ADD [COLUMN]

A nova coluna é adicionada automaticamente a todos os GSIs clusterizados e GSIs clusterizados únicos. Há suporte para rollback.

DROP [COLUMN]

Não é possível remover a chave primária, a chave de shard da tabela, a chave de shard de uma tabela de índice ou colunas únicas de um índice composto

CHANGE [COLUMN]

Não é possível renomear a chave primária, a chave de shard da tabela, a chave de shard de uma tabela de índice ou colunas únicas de um índice composto. Para remover restrições de coluna (exceto colunas únicas de um índice composto), utilize a hint /*+TDDL: cmd_extra(ALLOW_LOOSE_ALTER_COLUMN_WITH_GSI=true)*/. Consulte Como usar hints. Para alterar o valor padrão de uma coluna, use SET DEFAULT ou DROP DEFAULT.

MODIFY [COLUMN]

Aplicam-se as mesmas restrições de renomeação e de hint do CHANGE [COLUMN]

`ALTER [COLUMN] col_name { SET DEFAULT

DROP DEFAULT }`

Define ou remove o valor padrão de uma coluna. Há suporte para rollback, exceto para colunas do tipo CURRENT_TIMESTAMP.

Próximos passos