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
AUTOVersã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
LENGTHda 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 INDEXe 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:
|
Componente |
Descrição |
|
|
Palavra-chave que define o tipo do índice como CCI |
|
Tabela primária |
|
|
Nome do índice |
|
|
Chave de ordenação |
|
|
Cláusula de partição do índice |
|
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 |
|
Sugere ao otimizador que prefira ou ignore um índice específico. |
|
3 |
|
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? |
|
|
Sim |
Sim |
Sim |
|
|
Sim |
Sim |
Sim |
|
|
Não |
N/A |
N/A |
|
|
Não |
Não |
Não |
|
|
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 |
|
|
|
Sim |
|
|
|
Sim |
|
|
|
Sim |
|
|
|
Sim |
|
|
|
Não (proibido) |
|
|
|
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.