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 = autoouMODE = 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 ( |
|
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_). Executeshow full create tablepara 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. Executeshow full create tablepara 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 |
|
|
Índice local |
|
|
GSI, com sharding baseado nas regras de sharding automático |
|
|
GSI |
|
|
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 |
|
|
Cria um índice local e o adiciona ao índice clusterizado da tabela |
|
|
Cria um GSI e um índice local correspondente com prefixo |
|
|
Cria o GSI ou índice clusterizado, além de um índice local com prefixo |
ALTER TABLE
|
Cláusula |
Restrição |
|
|
|
KEY}` |
Aplicam-se as mesmas regras de conversão do |
|
|
A nova coluna é adicionada automaticamente a todos os GSIs clusterizados e GSIs clusterizados únicos. Há suporte para rollback. |
|
|
|
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 |
|
|
|
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 |
|
|
|
Aplicam-se as mesmas restrições de renomeação e de hint do |
|
|
|
DROP DEFAULT }` |
Define ou remove o valor padrão de uma coluna. Há suporte para rollback, exceto para colunas do tipo |
Próximos passos
CREATE TABLE: Referência completa de sintaxe para criação de tabelas no modo de particionamento automático
Criar uma tabela não particionada e uma tabela broadcast: Para tabelas cujos tipos de dados da chave primária não são suportados para sharding automático
Alterar o tipo e modifique a regra de particionamento de uma tabela: Como alterar regras de sharding após a criação da tabela
Como usar hints: Referência de sintaxe de hints para operações avançadas de DDL