Tous les produits
Search
Centre de documentation

PolarDB:Index clusterisés

Dernière mise à jour :Aug 11, 2026

Dans une base de données distribuée, les requêtes filtrant sur une colonne d'index mais renvoyant des colonnes non indexées nécessitent un retour à la table. Cette opération consiste à récupérer les données depuis la table de base après identification des entrées d'index correspondantes. Cet aller-retour supplémentaire génère des E/S réseau et augmente la latence des requêtes.

Un index clusterisé élimine cette surcharge. Il s'agit d'un type particulier d'index secondaire global (GSI) incluant toutes les colonnes de la table de base. Les requêtes traitées via un index clusterisé récupèrent toutes les colonnes nécessaires sans analyser la table de base, réduisant ainsi les E/S et la latence.

PolarDB-X gère automatiquement la couverture des colonnes et maintient la synchronisation entre l'index clusterisé et la table de base.

Prérequis

Avant de commencer, assurez-vous de disposer :

  • D'une instance PolarDB-X exécutant la version du noyau V5.4.9 ou ultérieure

Fonctionnement

L'ajout du mot-clé CLUSTERED à une définition d'index amène PolarDB-X à créer une table d'index reproduisant toutes les colonnes de la table de base. Les lectures s'effectuent directement sur cette table d'index, évitant ainsi l'analyse de la table de base. Toute mise à jour de colonne dans la table de base se propage automatiquement vers l'index clusterisé. Les index locaux de la table de base sont également synchronisés avec la table d'index clusterisé.

Créer un index clusterisé

Ajoutez le mot-clé CLUSTERED à n'importe quelle définition d'index. PolarDB-X prend en charge trois méthodes.

Créer une table avec un index clusterisé

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] ...
Si la table utilise sa clé primaire comme clé de shard, omettez la règle de sharding dans [drds_partition_options] .

Ajouter un index clusterisé à une table existante

Avec CREATE INDEX :

CREATE [UNIQUE]
    CLUSTERED INDEX index_name [index_type]
    ON tbl_name (index_col_name,...)
    [drds_partition_options]
    [index_option] ...
Si la table utilise sa clé primaire comme clé de shard, omettez la règle de sharding dans [drds_partition_options] .

Avec 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] ...
Lors de l'utilisation de ALTER TABLE :
Spécifiez une seule règle de sharding dans la clause alter_specification .
Attribuez toujours un nom à l'index clusterisé.
Si la table utilise sa clé primaire comme clé de shard, omettez la règle de sharding dans [drds_partition_options] .

Exemple

L'exemple suivant crée une table partitionnée, ajoute un index clusterisé sur seller_id et x, puis vérifie le résultat.

Créer la table de 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
);

Créer l'index clusterisé :

CREATE CLUSTERED INDEX `c_i` ON `t_order` (seller_id, x)

Vérifier le schéma de la table de base :

SHOW CREATE TABLE t_order;

La sortie affiche à la fois la clé locale et l'entrée de l'index clusterisé :

+---------+-----------------------------------------------------------------------------------------------+
| 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)

Vérifier le schéma de l'index clusterisé :

SHOW CREATE TABLE c_i;

La sortie confirme que l'index clusterisé contient toutes les colonnes de la table de 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)

Étapes suivantes

  • Pour obtenir la liste complète des opérations et des limites applicables aux index clusterisés, consultez GSI.