Em bancos de dados distribuídos, consultas que filtram por uma coluna indexada, mas retornam colunas não indexadas, exigem acesso à tabela base. Esse processo busca os dados na tabela original após localizar as entradas correspondentes no índice. Essa ida e volta adicional gera E/S de rede e aumenta a latência da consulta.
Um índice clusterizado elimina essa sobrecarga. Trata-se de um tipo especial de índice secundário global (GSI) que inclui todas as colunas da tabela base. Consultas atendidas por um índice clusterizado obtêm todas as colunas necessárias sem varrer a tabela base, o que reduz tanto a E/S quanto a latência.
O PolarDB-X gerencia automaticamente a cobertura de colunas e mantém o índice clusterizado sincronizado com a tabela base.
Pré-requisitos
Antes de começar, verifique se você tem:
Uma instância do PolarDB-X executando a versão de kernel V5.4.9 ou posterior
Como funciona
Ao adicionar a palavra-chave CLUSTERED à definição de um índice, o PolarDB-X cria uma tabela de índice que espelha todas as colunas da tabela base. As leituras acessam diretamente essa tabela de índice e evitam a varredura da tabela base. Qualquer atualização de coluna na tabela base é propagada automaticamente para o índice clusterizado. Índices locais na tabela base também são sincronizados com a tabela do índice clusterizado.
Crie um índice clusterizado
Adicione a palavra-chave CLUSTERED a qualquer definição de índice. O PolarDB-X oferece suporte a três métodos.
Crie uma tabela com um índice clusterizado
CREATE [SHADOW] TABLE [IF NOT EXISTS] tbl_name
(create_definition, ...)
[table_options]
[drds_partition_options]
create_definition:
[UNIQUE] CLUSTERED INDEX index_name [index_type] (index_col_name,...)
[drds_partition_options]
[index_option] ...
Se a tabela utilizar sua chave primária como chave de fragmentação, omita a regra de fragmentação em [drds_partition_options] .
Adicionar um índice clusterizado a uma tabela existente
Usando CREATE INDEX:
CREATE [UNIQUE]
CLUSTERED INDEX index_name [index_type]
ON tbl_name (index_col_name,...)
[drds_partition_options]
[index_option] ...
Caso a tabela use a chave primária como chave de fragmentação, não inclua a regra de fragmentação em [drds_partition_options] .
Usando ALTER TABLE:
ALTER TABLE tbl_name
alter_specification
alter_specification:
| ADD [UNIQUE] CLUSTERED {INDEX|KEY} index_name
[index_type] (index_col_name,...)
[drds_partition_options]
[index_option] ...
Ao usar ALTER TABLE :
Especifique apenas uma regra de fragmentação na cláusula alter_specification .
Sempre forneça um nome para o índice clusterizado.
Se a tabela usar a chave primária como chave de fragmentação, omita a regra de fragmentação em [drds_partition_options] .
Exemplo
O exemplo a seguir cria uma tabela particionada, adiciona um índice clusterizado em seller_id e x e verifica o resultado.
Crie a tabela base:
CREATE PARTITION TABLE `t_order` (
`t` timestamp null default CURRENT_TIMESTAMP,
`x` int default 3,
`order_id` varchar(20) DEFAULT NULL,
`seller_id` varchar(20) DEFAULT NULL
);
Crie o índice clusterizado:
CREATE CLUSTERED INDEX `c_i` ON `t_order` (seller_id, x)
Verifique o esquema da tabela base:
SHOW CREATE TABLE t_order;
A saída exibe tanto a chave local quanto a entrada do índice clusterizado:
+---------+-----------------------------------------------------------------------------------------------+
| Table | Create Table |
+---------+-----------------------------------------------------------------------------------------------+
| t_order | CREATE PARTITION TABLE `t_order` (
`t` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
`x` int(11) DEFAULT '3',
`order_id` varchar(20) DEFAULT NULL,
`seller_id` varchar(20) DEFAULT NULL,
LOCAL KEY `_local_c_i` (`seller_id`, `x`),
CLUSTERED INDEX `c_i`(`seller_id`, `x`) DBPARTITION BY HASH(`seller_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 |
+---------+-----------------------------------------------------------------------------------------------+
1 row in set (0.08 sec)
Verifique o esquema do índice clusterizado:
SHOW CREATE TABLE c_i;
A saída confirma que o índice clusterizado contém todas as colunas da tabela base:
+-------+---------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+---------------------------------------------------------------------------------------------------+
| c_i | CREATE TABLE `c_i` (
`t` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
`x` int(11) DEFAULT '3',
`order_id` varchar(20) DEFAULT NULL,
`seller_id` varchar(20) DEFAULT NULL,
KEY `auto_shard_key_seller_id` USING BTREE (`seller_id`),
KEY `i_seller_id_x` USING BTREE (`seller_id`, `x`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 dbpartition by hash(`seller_id`) |
+-------+---------------------------------------------------------------------------------------------------+
1 row in set (0.03 sec)
Próximos passos
Para obter a lista completa de operações e limites aplicáveis a índices clusterizados, consulte GSI.