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
AUTOVersion : 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
LENGTHde 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 INDEXainsi 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 :
| 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.