Les index standards sur les tables partitionnées sont locaux : ils ne couvrent que les données d'une seule partition. Par conséquent, les requêtes qui ne filtrent pas sur la clé de partition doivent analyser toutes les partitions, les résultats ne sont pas triés globalement et les contraintes d'unicité doivent inclure toutes les clés de partition. Les index secondaires globaux (GSI) lèvent ces restrictions en s'étendant à toutes les partitions, ce qui permet d'interroger efficacement n'importe quelle colonne et d'appliquer l'unicité sans inclure les clés de partition.
Pour utiliser cette fonctionnalité, accédez au Quota Center . Recherchez le quota via son Quota ID polardb_mysql_gsi , puis cliquez sur Apply dans la colonne Actions.
Pourquoi les index locaux présentent des limites
Un index local est partitionné de la même manière que sa table. Chaque partition d'index ne couvre que la partition de table correspondante ; ainsi, les données sont triées au sein de chaque partition, mais pas entre elles. Cette configuration engendre trois problèmes lorsque les requêtes n'incluent pas la clé de partition :
Analyses complètes des partitions : Toutes les partitions sont analysées, ce qui provoque une amplification des lectures qui augmente avec le nombre de partitions.
Absence d'ordre global garanti : Les résultats provenant de partitions triées ne sont pas triés globalement, ce qui peut déclencher une étape de tri supplémentaire.
Restriction des index uniques : Un index unique local doit inclure toutes les clés de partition pour garantir l'unicité entre les partitions.
Un GSI n'est pas partitionné. Il est construit à partir des données de toutes les partitions et est trié globalement. Un index globalement unique sur un GSI n'a pas besoin d'inclure toutes les clés de partition.
Quand utiliser un GSI
|
Scénario |
Type d'index recommandé |
Raison |
|
Requêtes filtrant fréquemment sur des colonnes autres que la clé de partition |
GSI |
Évite les analyses complètes des partitions |
|
Contraintes d'unicité globale sur des colonnes autres que la clé de partition |
GSI |
Les index uniques locaux nécessitent toutes les clés de partition |
|
Archivage peu fréquent des partitions (par exemple, partitions mensuelles conservées pendant plusieurs années) |
GSI |
Meilleures performances de requête, moins de fragmentation des partitions |
|
Requêtes limitées principalement à une seule partition |
Index local |
Frais d'écriture réduits |
Versions prises en charge
Cette fonctionnalité nécessite un cluster PolarDB for MySQL exécutant la version 8.0.2, révision 8.0.2.2.7 ou ultérieure. Pour savoir comment vérifier la version de votre cluster, consultez la rubrique Interrogation du numéro de version.
Limitations
Les GSI sont pris en charge uniquement sur les tables partitionnées InnoDB. Les tables partitionnées hybrides ne sont pas prises en charge.
Un GSI ne peut pas être un index full-text ni un index spatial.
Les GSI ne sont pas pris en charge sur les tables compressées, temporaires ou chiffrées. Les tables utilisant le format de ligne REDUNDANT ou COMPRESSED ne sont pas non plus prises en charge.
Les tables dotées de GSI ne prennent pas en charge les colonnes générées.
-
Les opérations DDL au niveau des partitions — à l'exception de l'ajout, de la suppression de partitions RANGE ou LIST et du troncature des partitions — invalident les GSI existants. Vous devez supprimer et reconstruire tous les GSI de la table, ou utiliser la syntaxe
UPDATE GLOBAL INDEXpour les reconstruire dans la même instruction.RemarqueLa suppression de partitions RANGE ou LIST et le troncature des partitions sans invalider les GSI constituent une fonctionnalité soumise à autorisation. Vous devez demander l'accès avant de pouvoir l'utiliser. Pour plus d'informations, consultez la section Améliorations des fonctionnalités.
Améliorations des fonctionnalités
Créez des GSI plus rapidement en utilisant le DDL parallèle.
Utilisez l'ajout instantané de colonne sur les tables partitionnées dotées de GSI.
Pour les tables partitionnées par RANGE ou LIST avec des GSI, les verrous de métadonnées (MDL) au niveau des partitions sont pris en charge lors de l'ajout de nouvelles partitions.
Convertir une table avec des GSI en une table partitionnée par INTERVAL RANGE, ou créer directement des GSI sur une table partitionnée par INTERVAL RANGE.
Lorsque vous effectuez des opérations DDL au niveau des partitions sur une table partitionnée dotée de GSI, utilisez la syntaxe
UPDATE GLOBAL INDEXpour reconstruire les GSI dans la même instruction.-
Vous pouvez supprimer des partitions RANGE ou LIST, ou tronquer des partitions de tout type, sans invalider les GSI existants. Il s'agit d'une fonctionnalité soumise à autorisation. Pour l'activer, accédez au Quota Center et recherchez l'Quota ID
polardb_mysql_gsi_drop_partitionoupolardb_mysql_gsi_truncate_part. Dans la colonne Actions, cliquez sur Apply pour activer la fonctionnalité.RemarqueCette fonctionnalité est prise en charge uniquement sur PolarDB for MySQL 8.0.2, révision 8.0.2.2.31 ou ultérieure.
-
Lorsque vous supprimez ou tronquez des partitions sur une table dotée de GSI, des données obsolètes peuvent subsister dans le GSI si vous ne le reconstruisez pas. Vous pouvez activer la fonctionnalité de purge asynchrone pour qu'un thread d'arrière-plan nettoie automatiquement les données obsolètes. Il s'agit d'une fonctionnalité soumise à autorisation. Pour l'activer, accédez au Quota Center et recherchez l'Quota ID
polardb_mysql_gsi_async_purge. Dans la colonne Actions, cliquez sur Apply pour activer la fonctionnalité.RemarqueCette fonctionnalité est prise en charge uniquement sur PolarDB for MySQL 8.0.2, révision 8.0.2.2.35 ou ultérieure.
Syntaxe
Ajoutez le mot-clé GLOBAL ou LOCAL après le nom de l'index lors de la création d'un index.
Si vous omettez le mot-clé, un index local est créé par défaut.
-- Create a global index
INDEX index_name(column) GLOBAL
-- Create a local index
INDEX index_name(column) LOCAL
Créer un GSI
Créer un GSI inline avec la table
Ajoutez le mot-clé GLOBAL lors de la définition de l'index dans l'instruction CREATE TABLE :
CREATE TABLE t1(
a INT PRIMARY KEY,
b INT,
INDEX k1(b) GLOBAL
) PARTITION BY HASH(a) PARTITIONS 3;
Ajouter un GSI à une table existante
Utilisez ALTER TABLE pour ajouter un index global, ou CREATE UNIQUE INDEX pour ajouter un index globalement unique :
-- Create the table
CREATE TABLE t1(
a INT PRIMARY KEY,
b INT
) PARTITION BY HASH(a) PARTITIONS 3;
-- Add a global index on column b
ALTER TABLE t1 ADD INDEX k1(b) GLOBAL;
-- Add a globally unique index on column b
CREATE UNIQUE INDEX k2 ON t1(b) GLOBAL;
Reconstruire un GSI lors d'une opération DDL de partition
Utilisez UPDATE GLOBAL INDEX pour reconstruire les GSI dans la même instruction qu'une opération DDL au niveau des partitions. Cela évite de laisser les GSI dans un état invalide.
L'exemple suivant crée une table partitionnée par RANGE avec un GSI, puis supprime une partition et reconstruit le GSI en une seule instruction :
-- Step 1: Create a range-partitioned table with a global index
CREATE TABLE t1(
a INT PRIMARY KEY,
b INT,
INDEX k1(b) GLOBAL
) PARTITION BY RANGE (`a`)
(PARTITION p0 VALUES LESS THAN (5) ENGINE = InnoDB,
PARTITION p1 VALUES LESS THAN (10) ENGINE = InnoDB);
-- Step 2: Drop the p1 partition and rebuild the GSI
ALTER TABLE t1 DROP PARTITION p1 UPDATE GLOBAL INDEX;
Performances
Les GSI offrent de meilleures performances que les index locaux pour les requêtes SELECT, UPDATE et DELETE qui n'incluent pas la clé de partition. L'avantage s'accroît à mesure que le nombre de partitions et le volume de données augmentent.
Configuration du test : Deux tables partitionnées par HASH avec 32 partitions et 1 000 000 de lignes chacune — l'une avec un index local, l'autre avec un GSI.
-- Table with local index
CREATE TABLE mytest1.big_table_1(
a INT PRIMARY KEY,
b INT,
c INT,
INDEX k1(b) LOCAL
) PARTITION BY HASH(a) PARTITIONS 32;
-- Table with GSI
CREATE TABLE mytest2.big_table_1(
a INT PRIMARY KEY,
b INT,
c INT,
INDEX k1(b) GLOBAL
) PARTITION BY HASH(a) PARTITIONS 32;
SELECT — temps d'exécution, la condition de requête n'inclut pas la clé de partition :

UPDATE — temps d'exécution, la condition de requête n'inclut pas la clé de partition :

DELETE — temps d'exécution, la condition de requête n'inclut pas la clé de partition :

L'avantage en termes de performances des GSI est plus prononcé à mesure que le volume de données et le nombre de partitions augmentent.
Étapes suivantes
DDL parallèle — accélère la création de GSI sur les grandes tables
Ajout instantané de colonne — ajoute des colonnes aux tables partitionnées avec des GSI sans reconstruire entièrement la table
Tables partitionnées par INTERVAL RANGE — gestion automatique des partitions compatible avec les GSI