Todos os produtos
Search
Central de documentação

PolarDB:Índices clusterizados

Última atualização: Jun 28, 2026

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.