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.