Todos os produtos
Search
Central de documentação

PolarDB:Crie e use um CCI

Última atualização: Jun 28, 2026

Este tópico explica como criar e usar o recurso de índice colunar clusterizado (CCI) no PolarDB-X para acelerar consultas analíticas em seus dados.

Pré-requisitos

Antes de começar, verifique se sua instância atende aos seguintes requisitos:

  • Edição: Enterprise Edition com banco de dados no modo AUTO

  • Versão: 5.4.19-16989811 ou posterior

Para obter informações sobre as regras de nomenclatura de versões, consulte Notas de versão. Para verificar sua versão atual, consulte Visualize e atualize a versão de uma instância.

Observações de uso

  • Índices de prefixo não são suportados em um CCI.

  • Especifique um nome de índice ao criar um CCI.

  • Por padrão, o CCI inclui todas as colunas da tabela primária e se atualiza automaticamente quando colunas são adicionadas ou removidas. Não é possível alterar manualmente as colunas incluídas.

  • A criação de um CCI não gera índices locais adicionais.

  • O parâmetro LENGTH da chave de ordenação é ignorado na definição do índice.

  • Instâncias primárias, instâncias somente leitura e instâncias columnstore somente leitura suportam SHOW INDEX e comandos de consulta relacionados. Consulte SHOW COLUMNAR INDEX, SHOW COLUMNAR OFFSET e SHOW COLUMNAR STATUS.

  • Apenas instâncias columnstore somente leitura permitem a execução de consultas baseadas em CCI.

Sintaxe

O PolarDB-X estende a sintaxe da Linguagem de Definição de Dados (DDL) do MySQL. Use a sintaxe abaixo para criar um CCI da mesma forma que você cria um índice comum no MySQL:

CREATE
    CLUSTERED COLUMNAR INDEX index_name
    ON tbl_name (index_sort_key_name,...)
    [partition_options]

-- Define a partitioning policy
partition_options:
    PARTITION BY
          HASH({column_name | partition_func(column_name)})
        | KEY(column_list)
        | RANGE({column_name | partition_func(column_name)})
        | RANGE COLUMNS(column_list)
        | LIST({column_name | partition_func(column_name)})
        | LIST COLUMNS(column_list)
    partition_list_spec

-- Define a partitioning function
partition_func:
    YEAR
  | TO_DAYS
  | TO_SECOND
  | UNIX_TIMESTAMP
  | MONTH

-- Define a partition list
partition_list_spec:
    hash_partition_list
  | range_partition_list
  | list_partition_list

-- For HASH/KEY partitioned tables
hash_partition_list:
    PARTITIONS partition_count

-- For RANGE/RANGE COLUMNS partitioned tables
range_partition_list:
    range_partition [, range_partition ...]

range_partition:
    PARTITION partition_name VALUES LESS THAN {(expr | value_list)} [partition_spec_options]

-- For LIST/LIST COLUMNS partitioned tables
list_partition_list:
    list_partition [, list_partition ...]

list_partition:
    PARTITION partition_name VALUES IN (value_list) [partition_spec_options]

Crie um CCI

O exemplo a seguir cria uma tabela chamada t_order e um CCI chamado cc_i_seller associado a ela.

Etapa 1: Criar a tabela primária.

CREATE TABLE t_order (
  `id` bigint(11) NOT NULL AUTO_INCREMENT,
  `order_id` varchar(20) DEFAULT NULL,
  `buyer_id` varchar(20) DEFAULT NULL,
  `seller_id` varchar(20) DEFAULT NULL,
  `order_snapshot` longtext DEFAULT NULL,
  `order_detail` longtext DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `l_i_order` (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 partition by hash(`order_id`) partitions 16;

Etapa 2: Criar o CCI.

CREATE CLUSTERED COLUMNAR INDEX `cc_i_seller` ON t_order (`seller_id`) partition by hash(`order_id`) partitions 16;

O diagrama anotado abaixo ilustra cada componente da definição do CCI:

image

Componente

Descrição

CLUSTERED COLUMNAR

Palavra-chave que define o tipo do índice como CCI

Tabela primária

t_order, particionada por HASH em order_id com 16 partições

Nome do índice

cc_i_seller — usado para referenciar o índice em instruções SQL

Chave de ordenação

seller_id — os dados no arquivo de índice são armazenados ordenados por esta coluna

Cláusula de partição do índice

partition by hash(order_id) partitions 16 — usa a mesma sintaxe de CREATE TABLE

Verifique o status de criação do CCI

Após executar a instrução CREATE CLUSTERED COLUMNAR INDEX, verifique o status da compilação:

SHOW COLUMNAR INDEX FROM t_order;

Para monitorar o progresso da tarefa DDL:

SHOW DDL;

O CCI estará pronto para uso quando o status for exibido como concluído. Para obter uma descrição dos campos de saída, consulte SHOW COLUMNAR INDEX e SHOW DDL.

Usar um CCI em consultas

Depois de criar um CCI, especifique a tabela de índice a ser usada nas consultas das seguintes maneiras:

Nível

Mecanismo

Comportamento

1 (padrão)

Automático (otimizador baseado em custo)

O otimizador seleciona automaticamente o índice de menor custo. Nenhuma dica é necessária.

2

USE INDEX / IGNORE INDEX

Sugere ao otimizador que prefira ou ignore um índice específico.

3

FORCE INDEX

Sobrescreve o otimizador e força a consulta a usar o índice especificado.

Comece com a seleção automática. Use dicas apenas quando precisar sobrescrever a decisão do otimizador.

Seleção automática

Em consultas a uma tabela primária que contém um CCI, o PolarDB-X seleciona automaticamente a tabela de índice que o otimizador determina ter o menor custo. Atualmente, apenas instâncias columnstore somente leitura suportam consultas baseadas em CCI. Nenhuma configuração adicional é necessária.

USE INDEX

Sugira ao otimizador o uso do índice especificado:

USE INDEX({index_name},...)

Exemplo — preferir cc_i_seller:

SELECT t_order.id, t_order.order_snapshot
FROM t_order USE INDEX(cc_i_seller)
WHERE t_order.seller_id = 's1';

IGNORE INDEX

Indique ao otimizador para ignorar o índice especificado:

IGNORE INDEX({index_name},...)

Exemplo — excluir cc_i_seller da consideração:

SELECT t_order.id, t_order.order_snapshot
FROM t_order IGNORE INDEX(cc_i_seller)
WHERE t_order.seller_id = 's1';

FORCE INDEX

Sobrescreva o otimizador e force o uso do índice especificado:

FORCE INDEX({index_name})

Exemplo — forçar cc_i_seller em uma junção:

SELECT a.*, b.order_id
FROM t_seller a
  JOIN t_order b FORCE INDEX(cc_i_seller) ON a.seller_id = b.seller_id
WHERE a.seller_nick = 'abc';

Limitações

Tipos de dados suportados

A tabela a seguir mostra os tipos de dados suportados para a chave primária da tabela primária e para as chaves de ordenação e de partição do CCI:

Tipo de dado

Chave primária

Chave de ordenação

Chave de partição

Numérico: BIT (UNSIGNED)

Suportado

Suportado

Não suportado

Numérico: TINYINT (UNSIGNED)

Suportado

Suportado

Suportado

Numérico: SMALLINT (UNSIGNED)

Suportado

Suportado

Suportado

Numérico: MEDIUMINT (UNSIGNED)

Suportado

Suportado

Suportado

Numérico: INT (UNSIGNED)

Suportado

Suportado

Suportado

Numérico: BIGINT (UNSIGNED)

Suportado

Suportado

Suportado

Tempo: DATE

Suportado

Suportado

Suportado

Tempo: DATETIME

Suportado

Suportado

Suportado

Tempo: TIMESTAMP

Suportado

Suportado

Suportado

Tempo: TIME

Suportado

Suportado

Não suportado

Tempo: YEAR

Suportado

Suportado

Não suportado

String: CHAR

Suportado

Suportado

Suportado

String: VARCHAR

Suportado

Suportado

Suportado

String: TEXT

Suportado

Suportado

Não suportado

String: BINARY

Suportado

Suportado

Suportado

String: VARBINARY

Suportado

Suportado

Suportado

String: BLOB

Suportado

Suportado

Não suportado

Ponto flutuante: FLOAT

Não suportado

Não suportado

Não suportado

Ponto flutuante: DOUBLE

Não suportado

Não suportado

Não suportado

Ponto flutuante: DECIMAL

Não suportado

Não suportado

Não suportado

Ponto flutuante: NUMERIC

Não suportado

Não suportado

Não suportado

Especial: JSON

Não suportado

Não suportado

Não suportado

Especial: ENUM

Não suportado

Não suportado

Não suportado

Especial: SET

Não suportado

Não suportado

Não suportado

Especial: POINT

Não suportado

Não suportado

Não suportado

Especial: GEOMETRY

Não suportado

Não suportado

Não suportado

Os algoritmos de particionamento suportam diferentes tipos de dados. Para mais informações, consulte Tipos de dados .

Limites de instruções DDL

Para controlar se instruções DDL podem ser executadas em uma tabela que possui um CCI, defina o seguinte parâmetro (true permite DDL; false bloqueia):

SET [GLOBAL] forbid_ddl_with_cci = [true | false];

Operações DDL suportadas em tabelas primárias com CCI:

Categoria Ação SQL de exemplo Suportado
Tabela primária Excluir tabela DROP TABLE tbl_name; Sim
Truncar tabela TRUNCATE TABLE tbl_name; Sim
Renomear tabela ALTER TABLE old_tbl_name RENAME TO new_tbl_name; ou RENAME TABLE old_tbl_name TO new_tbl_name; Sim
Renomear múltiplas tabelas RENAME TABLE tbl_name_a TO tbl_name_b, tbl_name_c TO tbl_name_d; Sim
Adicionar coluna ALTER TABLE tbl_name ADD col_name TYPE; Sim
Excluir coluna ALTER TABLE tbl_name DROP COLUMN col_name; Sim
Modificar tipo de coluna ALTER TABLE tbl_name MODIFY col_name TYPE; Sim
Renomear coluna ALTER TABLE tbl_name CHANGE old_col new_col TYPE; Sim
Modificar valor padrão da coluna ALTER TABLE tbl_name ALTER COLUMN col_name SET DEFAULT default_value; ou ALTER TABLE tbl_name ALTER COLUMN col_name DROP DEFAULT; Sim
Alteração de tipo de coluna sem bloqueio ALTER TABLE tbl_name MODIFY col_name TYPE, ALGORITHM = omc; Sim
Múltiplas operações ALTER TABLE ALTER TABLE tbl_name MODIFY col_name_a, DROP COLUMN col_name_b; Sim
Coluna gerada Não
Alteração de partição Não
CCI Criar CCI CREATE CLUSTERED COLUMNAR INDEX cci_name; ou ALTER TABLE tbl_name ADD CLUSTERED COLUMNAR INDEX cci_name; Sim
Excluir CCI DROP INDEX cci_name ON TABLE tbl_name; ou ALTER TABLE tbl_name DROP INDEX cci_name; Sim
Renomear CCI ALTER TABLE tbl_name RENAME INDEX cci_name_a TO cci_name_b; Sim
Adicionar uma partição RANGE ALTER TABLE tbl_name.cci_name ADD PARTITION; Sim
Outras alterações de partição Não

Restrições de alteração de coluna com ALTER TABLE:

Instrução

Pode modificar chave primária?

Pode modificar chave de partição do índice?

Pode modificar chave de ordenação?

MODIFY COLUMN

Sim

Sim

Sim

ALTER COLUMN SET DEFAULT / ALTER COLUMN DROP DEFAULT

Sim

Sim

Sim

ADD COLUMN

Não

N/A

N/A

CHANGE COLUMN

Não

Não

Não

DROP COLUMN

Não

Não

Não

Nas versões 5.4.20-20250714 e posteriores, MODIFY COLUMN e alterações no valor padrão de colunas são suportadas para algumas chaves primárias, chaves de partição de CCI e chaves de ordenação de CCI.

A modificação de uma coluna crítica (chave primária, chave de partição do CCI ou chave de ordenação do CCI) pode acionar uma recompilação completa do CCI, o que pode resultar em uma operação longa em tabelas grandes. Essa funcionalidade está desativada por padrão. Recomendamos o uso de execução assíncrona. Para ativá-la, defina os seguintes parâmetros antes de executar a instrução ALTER:

-- Allow modifying critical columns of a CCI
SET ENABLE_MODIFY_CCI_CRITICAL_COLUMN = TRUE;
-- Rebuild strategy: 0 lets the system select automatically
SET REBUILD_CCI_STRATEGY = 0;
-- Maximum number of CCIs per table; increase if the table already has multiple CCIs
SET MAX_CCI_COUNT = 2;

Tipos de dados suportados para MODIFY COLUMN / CHANGE COLUMN:

Suportado

Não suportado

Numérico: BIT (UNSIGNED), TINYINT (UNSIGNED), SMALLINT (UNSIGNED), MEDIUMINT (UNSIGNED), INT (UNSIGNED), BIGINT (UNSIGNED)

POINT, GEOMETRY

Tempo: DATETIME, TIMESTAMP, TIME, YEAR

Ponto flutuante: FLOAT, DOUBLE, DECIMAL, NUMERIC

String: CHAR, VARCHAR, TEXT, BINARY, VARBINARY, BLOB

Especial: JSON, ENUM, SET

Caso precise alterar uma coluna para POINT ou GEOMETRY, exclua o CCI com DROP INDEX, altere o tipo de dado e recrie o CCI.

Alterações de índice suportadas com ALTER TABLE:

Instrução

Suportado

ALTER TABLE ADD PRIMARY KEY

Sim

ALTER TABLE ADD [UNIQUE/FULLTEXT/SPATIAL/FOREIGN] KEY

Sim

ALTER TABLE DROP INDEX

Sim

ALTER TABLE DROP FOREIGN KEY fk_symbol

Sim

ALTER TABLE DROP PRIMARY KEY

Não (proibido)

ALTER TABLE RENAME INDEX

Sim — permite renomear um CCI

ALTER TABLE ALTER INDEX index_name {VISIBLE

INVISIBLE}

Não — não é possível modificar um CCI

ALTER TABLE {DISABLE

ENABLE} KEYS

Não — não é possível modificar um CCI

Perguntas frequentes

É possível criar um CCI sem especificar uma chave de ordenação?

Não. Especifique a chave de ordenação explicitamente na instrução CREATE CLUSTERED COLUMNAR INDEX. A chave de ordenação e a chave de partição podem ser colunas diferentes — por exemplo, use seller_id como chave de ordenação e order_id como chave de partição na mesma tabela.

É possível criar um CCI sem especificar uma chave de partição?

Sim. Se você omitir a chave de partição, o PolarDB-X usará a chave primária como chave de partição com particionamento HASH por padrão.

Como verifico o progresso da criação do CCI?

Execute SHOW COLUMNAR INDEX para visualizar o status atual e SHOW DDL para acompanhar o progresso da tarefa DDL. Para detalhes sobre como interpretar a saída, consulte SHOW COLUMNAR INDEX e SHOW DDL.

Como excluo um CCI?

Use a instrução DROP INDEX.