Tous les produits
Search
Centre de documentation

PolarDB:Créer et utiliser un CCI

Dernière mise à jour :Aug 11, 2026

Cette rubrique explique comment créer et utiliser la fonctionnalité d'index columnar clusterisé (CCI) dans PolarDB-X pour accélérer les requêtes analytiques sur vos données.

Prérequis

Avant de commencer, vérifiez que votre instance répond aux exigences suivantes :

  • Édition : Enterprise Edition avec une base de données en mode AUTO

  • Version : 5.4.19-16989811 ou ultérieure

Pour plus d'informations sur les règles de nommage des versions, consultez Release notes. Pour vérifier votre version actuelle, reportez-vous à View and update the version of an instance.

Remarques d'utilisation

  • Les index de préfixe ne sont pas pris en charge sur un CCI.

  • Vous devez spécifier un nom d'index lors de la création d'un CCI.

  • Par défaut, un CCI inclut toutes les colonnes de la table principale et se met à jour automatiquement lors de l'ajout ou de la suppression de colonnes. La modification manuelle des colonnes incluses est impossible.

  • La création d'un CCI n'entraîne pas la création d'index locaux supplémentaires.

  • Le paramètre LENGTH de la clé de tri est ignoré dans la définition de l'index.

  • Les instances principales, les instances en lecture seule et les instances columnstore en lecture seule prennent toutes en charge SHOW INDEX ainsi que les commandes de requête associées. Consultez SHOW COLUMNAR INDEX, SHOW COLUMNAR OFFSET et SHOW COLUMNAR STATUS.

  • Seules les instances columnstore en lecture seule permettent l'exécution de requêtes basées sur un CCI.

Syntaxe

PolarDB-X étend la syntaxe du langage de définition de données (DDL) de MySQL. Utilisez la syntaxe suivante pour créer un CCI, comme pour un index standard dans 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]

Créer un CCI

L'exemple suivant crée une table nommée t_order ainsi qu'un CCI nommé cc_i_seller sur cette dernière.

Étape 1 : Créez la table principale.

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;

Étape 2 : Créez le CCI.

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

Le diagramme annoté ci-dessous détaille chaque composant de la définition du CCI :

image

Composant Description
CLUSTERED COLUMNAR Mot-clé définissant le type d'index comme étant un CCI
Table principale t_order, partitionnée par HASH sur order_id avec 16 partitions
Nom de l'index cc_i_seller — utilisé pour référencer l'index dans les instructions SQL
Clé de tri seller_id — les données du fichier d'index sont stockées selon l'ordre de cette colonne
Clause de partitionnement de l'index partition by hash(order_id) partitions 16 — utilise la même syntaxe que CREATE TABLE

Vérifier l'état de création du CCI

Après avoir exécuté l'instruction CREATE CLUSTERED COLUMNAR INDEX, vérifiez l'état de construction :

SHOW COLUMNAR INDEX FROM t_order;

Pour surveiller la progression de la tâche DDL :

SHOW DDL;

Le CCI est prêt à l'emploi lorsque son statut indique qu'il est terminé. Pour obtenir une description des champs de sortie, consultez SHOW COLUMNAR INDEX et SHOW DDL.

Utiliser un CCI dans les requêtes

Une fois le CCI créé, vous disposez de plusieurs méthodes pour spécifier la table d'index à utiliser dans vos requêtes :

Niveau Mécanisme Comportement
1 (par défaut) Automatique (optimiseur basé sur le coût) L'optimiseur sélectionne automatiquement l'index au coût le plus faible. Aucune indication n'est requise.
2 USE INDEX / IGNORE INDEX Recommande à l'optimiseur de privilégier ou d'ignorer un index spécifique.
3 FORCE INDEX Outrepasse l'optimiseur et force la requête à utiliser l'index spécifié.

Privilégiez d'abord la sélection automatique. N'utilisez les indications que si vous devez impérativement outrepasser la décision de l'optimiseur.

Sélection automatique

Pour les requêtes portant sur une table principale contenant un CCI, PolarDB-X sélectionne automatiquement la table d'index dont le coût estimé par l'optimiseur est le plus faible. Actuellement, seules les instances columnstore en lecture seule prennent en charge les requêtes basées sur un CCI. Aucune configuration supplémentaire n'est nécessaire.

USE INDEX

Recommandez à l'optimiseur d'utiliser l'index spécifié :

USE INDEX({index_name},...)

Exemple — privilégier 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

Indiquez à l'optimiseur d'ignorer l'index spécifié :

IGNORE INDEX({index_name},...)

Exemple — exclure cc_i_seller de la sélection :

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

FORCE INDEX

Outrepassez l'optimiseur pour imposer l'utilisation de l'index spécifié :

FORCE INDEX({index_name})

Exemple — forcer cc_i_seller dans une jointure :

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';

Limitations

Types de données pris en charge

Le tableau suivant présente les types de données pris en charge pour la clé primaire de la table principale, ainsi que pour les clés de tri et de partitionnement du CCI :

Type de données Clé primaire Clé de tri Clé de partitionnement
Numérique : BIT (UNSIGNED) Pris en charge Pris en charge Non pris en charge
Numérique : TINYINT (UNSIGNED) Pris en charge Pris en charge Pris en charge
Numérique : SMALLINT (UNSIGNED) Pris en charge Pris en charge Pris en charge
Numérique : MEDIUMINT (UNSIGNED) Pris en charge Pris en charge Pris en charge
Numérique : INT (UNSIGNED) Pris en charge Pris en charge Pris en charge
Numérique : BIGINT (UNSIGNED) Pris en charge Pris en charge Pris en charge
Temporel : DATE Pris en charge Pris en charge Pris en charge
Temporel : DATETIME Pris en charge Pris en charge Pris en charge
Temporel : TIMESTAMP Pris en charge Pris en charge Pris en charge
Temporel : TIME Pris en charge Pris en charge Non pris en charge
Temporel : YEAR Pris en charge Pris en charge Non pris en charge
Chaîne : CHAR Pris en charge Pris en charge Pris en charge
Chaîne : VARCHAR Pris en charge Pris en charge Pris en charge
Chaîne : TEXT Pris en charge Pris en charge Non pris en charge
Chaîne : BINARY Pris en charge Pris en charge Pris en charge
Chaîne : VARBINARY Pris en charge Pris en charge Pris en charge
Chaîne : BLOB Pris en charge Pris en charge Non pris en charge
Virgule flottante : FLOAT Non pris en charge Non pris en charge Non pris en charge
Virgule flottante : DOUBLE Non pris en charge Non pris en charge Non pris en charge
Virgule flottante : DECIMAL Non pris en charge Non pris en charge Non pris en charge
Virgule flottante : NUMERIC Non pris en charge Non pris en charge Non pris en charge
Spécial : JSON Non pris en charge Non pris en charge Non pris en charge
Spécial : ENUM Non pris en charge Non pris en charge Non pris en charge
Spécial : SET Non pris en charge Non pris en charge Non pris en charge
Spécial : POINT Non pris en charge Non pris en charge Non pris en charge
Spécial : GEOMETRY Non pris en charge Non pris en charge Non pris en charge
Les algorithmes de partitionnement prennent en charge différents types de données. Pour plus d'informations, consultez Types de données .

Limites des instructions DDL

Pour contrôler l'exécution des instructions DDL sur une table possédant un CCI, définissez le paramètre suivant (true autorise les DDL ; false les bloque) :

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

Opérations DDL prises en charge sur les tables principales dotées d'un CCI :

Catégorie Action Exemple SQL Pris en charge
Table principale Supprimer la table DROP TABLE tbl_name; Oui
Vider la table TRUNCATE TABLE tbl_name; Oui
Renommer la table ALTER TABLE old_tbl_name RENAME TO new_tbl_name; ou RENAME TABLE old_tbl_name TO new_tbl_name; Oui
Renommer plusieurs tables RENAME TABLE tbl_name_a TO tbl_name_b, tbl_name_c TO tbl_name_d; Oui
Ajouter une colonne ALTER TABLE tbl_name ADD col_name TYPE; Oui
Supprimer une colonne ALTER TABLE tbl_name DROP COLUMN col_name; Oui
Modifier le type d'une colonne ALTER TABLE tbl_name MODIFY col_name TYPE; Oui
Renommer une colonne ALTER TABLE tbl_name CHANGE old_col new_col TYPE; Oui
Modifier la valeur par défaut d'une colonne ALTER TABLE tbl_name ALTER COLUMN col_name SET DEFAULT default_value; ou ALTER TABLE tbl_name ALTER COLUMN col_name DROP DEFAULT; Oui
Changement de type de colonne sans verrouillage ALTER TABLE tbl_name MODIFY col_name TYPE, ALGORITHM = omc; Oui
Opérations ALTER TABLE multiples ALTER TABLE tbl_name MODIFY col_name_a, DROP COLUMN col_name_b; Oui
Colonne générée — Non
Modification du partitionnement — Non
CCI Créer un CCI CREATE CLUSTERED COLUMNAR INDEX cci_name; ou ALTER TABLE tbl_name ADD CLUSTERED COLUMNAR INDEX cci_name; Oui
Supprimer un CCI DROP INDEX cci_name ON TABLE tbl_name; ou ALTER TABLE tbl_name DROP INDEX cci_name; Oui
Renommer un CCI ALTER TABLE tbl_name RENAME INDEX cci_name_a TO cci_name_b; Oui
Ajouter une partition RANGE ALTER TABLE tbl_name.cci_name ADD PARTITION; Oui
Autres modifications de partitionnement — Non

Contraintes de modification des colonnes avec ALTER TABLE :

Instruction Modification de la clé primaire possible ? Modification de la clé de partitionnement de l'index possible ? Modification de la clé de tri possible ?
MODIFY COLUMN Oui Oui Oui
ALTER COLUMN SET DEFAULT / ALTER COLUMN DROP DEFAULT Oui Oui Oui
ADD COLUMN Non N/A N/A
CHANGE COLUMN Non Non Non
DROP COLUMN Non Non Non
À partir de la version 5.4.20-20250714, MODIFY COLUMN et les modifications de valeurs par défaut des colonnes sont prises en charge pour certaines clés primaires, clés de partitionnement CCI et clés de tri CCI.

La modification d'une colonne critique (clé primaire, clé de partitionnement CCI ou clé de tri CCI) peut déclencher une reconstruction complète du CCI, opération potentiellement longue sur les tables volumineuses. Cette fonctionnalité est désactivée par défaut. Nous vous recommandons d'utiliser l'exécution asynchrone. Pour l'activer, définissez les paramètres suivants avant d'exécuter l'instruction 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;

Types de données pris en charge pour MODIFY COLUMN / CHANGE COLUMN :

Pris en charge Non pris en charge
Numérique : BIT (UNSIGNED), TINYINT (UNSIGNED), SMALLINT (UNSIGNED), MEDIUMINT (UNSIGNED), INT (UNSIGNED), BIGINT (UNSIGNED) POINT, GEOMETRY
Temporel : DATETIME, TIMESTAMP, TIME, YEAR
Virgule flottante : FLOAT, DOUBLE, DECIMAL, NUMERIC
Chaîne : CHAR, VARCHAR, TEXT, BINARY, VARBINARY, BLOB
Spécial : JSON, ENUM, SET

Si vous devez convertir une colonne vers le type POINT ou GEOMETRY, supprimez le CCI à l'aide de DROP INDEX, modifiez le type de données, puis recréez le CCI.

Modifications d'index prises en charge avec ALTER TABLE :

Instruction Pris en charge
ALTER TABLE ADD PRIMARY KEY Oui
ALTER TABLE ADD [UNIQUE/FULLTEXT/SPATIAL/FOREIGN] KEY Oui
ALTER TABLE DROP INDEX Oui
ALTER TABLE DROP FOREIGN KEY fk_symbol Oui
ALTER TABLE DROP PRIMARY KEY Non (interdit)
ALTER TABLE RENAME INDEX Oui — permet de renommer un CCI
ALTER TABLE ALTER INDEX index_name {VISIBLE INVISIBLE}

Non — impossible de modifier un CCI

ALTER TABLE {DISABLE ENABLE} KEYS

Non — impossible de modifier un CCI

FAQ

Est-il possible de créer un CCI sans spécifier de clé de tri ?

Non. Spécifiez explicitement la clé de tri dans l'instruction CREATE CLUSTERED COLUMNAR INDEX. La clé de tri et la clé de partitionnement peuvent correspondre à des colonnes différentes. Par exemple, utilisez seller_id comme clé de tri et order_id comme clé de partitionnement sur la même table.

Est-il possible de créer un CCI sans spécifier de clé de partitionnement ?

Oui. Si vous omettez la clé de partitionnement, PolarDB-X utilise par défaut la clé primaire comme clé de partitionnement avec un partitionnement HASH.

Comment vérifier la progression de la création d'un CCI ?

Exécutez SHOW COLUMNAR INDEX pour consulter l'état actuel et SHOW DDL pour suivre la progression de la tâche DDL. Pour plus de détails sur l'interprétation des résultats, consultez SHOW COLUMNAR INDEX et SHOW DDL.

Comment supprimer un CCI ?

Utilisez l'instruction DROP INDEX.