PolarDB for MySQL Columnstore Index (IMCI) propose une accélération automatique des requêtes basée sur IMCI, qui améliore les performances des requêtes SQL lentes sans intervention manuelle.
Présentation
La technologie d'index en colonnes (IMCI) de PolarDB for MySQL est conçue pour les requêtes complexes portant sur de grands volumes de données dans des scénarios OLAP. Grâce aux index en colonnes, PolarDB for MySQL intègre le traitement transactionnel en temps réel et l'analyse de données en temps réel au sein d'une solution de base de données HTAP (Hybrid Transactional and Analytical Processing) tout-en-un.
Traditionnellement, pour accélérer les tables impliquées dans des requêtes lentes, vous devez utiliser manuellement CREATE TABLE ou ALTER TABLE afin d'ajouter COLUMNAR=1 au champ COMMENT de la table pour créer un index en colonnes. Cette approche manuelle s'avère inefficace lorsque de nombreux modèles SQL présentent une logique complexe.
L'accélération automatique des requêtes basée sur IMCI (AutoIndex) ajoute automatiquement des index en colonnes aux tables cibles en fonction des requêtes lentes, ce qui permet d'accélérer les requêtes sans intervention manuelle.
Contexte technique
AutoIndex est une technique qui optimise les performances SQL en ajoutant automatiquement des index. Les index row store ont fait l'objet de recherches approfondies et sont implémentés commercialement, par exemple dans Oracle et SQL Server. Ces systèmes analysent les index secondaires susceptibles d'être ajoutés en fonction des prédicats, des clauses ORDER BY ou des jointures. Ils recalculent le coût de la requête en supposant qu'un tel index est créé, puis créent les index qui réduisent significativement le coût de la requête.
Dans le domaine des index en colonnes, AutoIndex a été adopté par des systèmes tels que Redshift, Snowflake, Databricks et Heatwave. Les méthodes d'automatisation typiques incluent :
Chargement/déchargement automatique : Crée automatiquement des index en colonnes et accélère les requêtes lentes en fonction de l'exécution des requêtes. Supprime automatiquement les index en colonnes rarement utilisés ou consommant trop de ressources afin de réduire l'utilisation du stockage.
Encodage automatique : Sélectionne automatiquement l'algorithme d'encodage optimal en fonction de la distribution des données de chaque colonne pour compresser davantage le stockage.
Sélection automatique de la clé de distribution : Équilibre la distribution des données dans les scénarios MPP, réduit le skew des données et optimise le brassage des données pour les opérations GROUP BY et JOIN distribuées.
Sélection automatique de la clé de tri : Utilise les prédicats fréquemment employés, les colonnes de jointure ou les colonnes de tri pour accélérer le filtrage ou le tri des requêtes.
Dans IMCI, la création automatique d'un index en colonnes coûte moins cher et est plus tolérante aux pannes que la création d'un index row store, pour les raisons suivantes :
Impact réduit sur les écritures : Un nombre excessif d'index row store affecte considérablement les performances d'écriture sur le nœud principal, tandis qu'IMCI ne matérialise pas les données en colonnes sur le nœud principal. Après l'ajout d'un index en colonnes, les opérations d'écriture doivent uniquement être synchronisées avec le nœud d'index en colonnes en lecture seule via Redo, sans impact notable sur les performances d'écriture.
Taux de compression élevé : Les index en colonnes atteignent généralement un taux de compression de 3 à 5 fois, de sorte que la surcharge de stockage liée aux nouveaux index est relativement faible.
Impact limité sur les opérations métier : Des structures de données efficaces et sans verrou collectent les informations SQL Trace, et le DDL non bloquant (Nonblock DDL) réduit les perturbations des opérations métier.
Fonctionnement
Suivi des requêtes lentes et génération d'instructions DDL
Chaque nœud du cluster utilise SQL Trace pour collecter les requêtes lentes et génère automatiquement des instructions DDL afin de créer des index en colonnes pour les instructions SQL éligibles. Le processus est le suivant :
SQL Trace : Utilise les modèles SQL comme clés et la table de hachage sans verrou officielle de MySQL pour suivre et enregistrer les informations d'exécution SQL. Cette conception convient aux scénarios à forte concurrence comportant un grand nombre de modèles SQL. Dans les scénarios de test Sysbench, SQL Trace n'affecte les performances de la base de données qu'à hauteur de 3 % maximum.
Condition de déclenchement : Lorsque le nombre de lignes analysées par une requête lente atteint le seuil configuré (100 000 lignes par défaut), AutoIndex génère une instruction DDL pour ajouter un index en colonnes à la table correspondante.
Conception à faible surcharge : Pour éviter d'analyser répétitivement les instructions SQL, d'ouvrir les tables et d'obtenir des verrous MDL, AutoIndex utilise directement la liste de tables mise en cache du THD (Thread Handler), ce qui n'ajoute pratiquement aucune surcharge système supplémentaire.
Connectez-vous directement à chaque nœud et interrogez la table système information_schema.imci_autoindex pour afficher les informations relatives aux requêtes lentes suivies pour lesquelles des instructions DDL ont été générées. Exemple :
SELECT * FROM information_schema.imci_autoindex
Combinez cette table avec information_schema.sql_sharing pour obtenir des informations plus détaillées sur l'exécution SQL :
SELECT *
FROM information_schema.imci_autoindex autoindex, information_schema.sql_sharing share
WHERE autoindex.sql_id = share.sql_id
AND share.type = 'SQL'
Collecte, agrégation des requêtes lentes et exécution DDL
Le nœud d'index en colonnes en lecture seule du cluster collecte et agrège les requêtes lentes avec recommandations d'index en colonnes provenant de tous les nœuds. Si plusieurs nœuds d'index en colonnes en lecture seule existent, l'un d'eux agit en tant que leader. Ce nœud trie les recommandations par temps d'exécution décroissant et exécute les instructions DDL recommandées séquentiellement jusqu'à atteindre la limite d'exécution DDL par cycle.
-
DDL instantané
L'ajout d'un index en colonnes sur le nœud principal est une opération DDL instantanée. Elle modifie uniquement le dictionnaire de données et n'apporte aucune modification réelle aux données dans la base de données principale. Le Redo est répliqué vers le nœud d'index en colonnes en lecture seule, qui construit l'index en colonnes en arrière-plan.
-
DDL non bloquant (Nonblock DDL)
Le DDL standard bloque les nouvelles transactions en attendant d'obtenir un verrou MDL-X. Si le DDL non bloquant ne parvient pas à obtenir le verrou, il autorise d'abord les nouvelles transactions à se poursuivre, puis réessaie continuellement d'acquérir le verrou. Dans les scénarios AutoIndex, le DDL n'est pas une opération urgente. Si une opération échoue lors du cycle actuel, elle peut être retentée lors du prochain cycle de planification automatique.
Interrogez la table système information_schema.imci_autoindex_executed depuis le point de terminaison du cluster pour afficher les instructions de recommandation d'index en colonnes récemment exécutées et les requêtes lentes associées (jusqu'à 128 enregistrements sont conservés).
-
Limites de planification et d'exécution
Par défaut, l'intervalle entre les cycles est de 1 minute et un maximum de 5 instructions DDL peuvent être exécutées à chaque cycle.
Les index en colonnes non couverts lors du cycle actuel ne sont retentés qu'après que des requêtes lentes ultérieures les aient de nouveau ciblés.
La gouvernance des ressources s'applique lorsque le nœud d'index en colonnes en lecture seule construit des index en colonnes. Les métriques de ressources augmentent, mais les ressources du nœud ne sont pas saturées.
Le cycle suivant est planifié uniquement après que les index en colonnes du cycle actuel ont été construits sur le nœud d'index en colonnes en lecture seule.
Activation et utilisation de l'index en colonnes
Pour maximiser l'efficacité d'AutoIndex, associez le nœud d'index en colonnes en lecture seule au point de terminaison du cluster et activez la distribution automatique des requêtes entre les nœuds row store et column store. Lors de la relecture du trafic de service réel, les requêtes lentes déclenchent AutoIndex pour créer des index en colonnes. Une fois que le nœud d'index en colonnes en lecture seule a terminé la construction des index, le mécanisme de distribution automatique des requêtes achemine les requêtes pertinentes vers ce nœud en fonction du coût de la requête, ce qui accélère les requêtes.
Si le trafic de service se connecte directement à un nœud en lecture seule standard, basculez manuellement le trafic vers le nœud d'index en colonnes en lecture seule après la création d'un index en colonnes. Pour plus d'informations sur les requêtes d'état des index en colonnes et les politiques de distribution des requêtes, consultez FAQ IMCI.
Résultats des tests
L'exemple suivant est basé sur l'ensemble de test TPC-H de 100 Go.
L'implémentation TPC-H présentée dans cette rubrique repose sur le benchmark TPC-H. Ces résultats de test ne peuvent pas être comparés aux résultats publiés du benchmark TPC-H car les tests ne satisfont pas pleinement à toutes les exigences TPC-H.
Configuration de l'environnement : Exécutez les 22 requêtes de test TPC-H une fois par minute. Activez HTAP Optimization (Transactional/Analytical Processing Splitting) pour le point de terminaison du cluster et définissez le degré de parallélisme du row store sur 8, principalement pour réduire la durée du test.
Résultats des tests : Le tableau ci-dessous montre que les performances des requêtes s'améliorent considérablement lors des cycles suivants. Durant la seconde partie du premier cycle, à partir de la 12e requête environ, AutoIndex avait créé des index en colonnes pour la plupart des tables, et l'optimiseur acheminait automatiquement ces requêtes vers le nœud d'index en colonnes en lecture seule.
|
Cycle d'exécution |
Temps total (s) |
Plans row store/plans column store |
Gain de performance |
|
1 |
8293 |
10/12 |
- |
|
2 |
118 |
1/21 |
Environ 70x |
|
3 |
110 |
0/22 |
Environ 75x |
Avantages
Les index en colonnes offrent une série d'avantages, avec des améliorations significatives en matière de compatibilité, de performances et de coûts :
Compatibilité MySQL à 100 % : Prend en charge tous les types de données MySQL et est entièrement compatible avec le protocole MySQL.
Excellentes performances HTAP : Améliore généralement les performances dans les scénarios analytiques d'un à deux ordres de grandeur.
Stockage hybride row et column store, coût réduit : Garantit la cohérence transactionnelle grâce au stockage hybride row et column store, tandis que les index en colonnes offrent de meilleures performances à moindre coût dans certains scénarios de requête.
Accélération automatique simplifiée : Permet une accélération automatique des performances en un clic, sans configuration ni réglage complexes.
Réduction de la charge opérationnelle : Crée automatiquement des index en colonnes pour les requêtes lentes, ce qui réduit le travail manuel d'optimisation des requêtes lentes.
Réduction des coûts informatiques : Optimise uniquement les requêtes lentes au lieu de créer des index en colonnes pour toutes les bases de données et tables, ce qui économise des ressources mémoire et de stockage.
Versions prises en charge
-
Les clusters **Enterprise Edition** doivent satisfaire aux conditions suivantes :
Series : Cluster Edition.
-
Version du moteur de base de données :
MySQL 8.0.1, et la version mineure du moteur doit être 8.0.1.1.45.2 ou ultérieure.
MySQL 8.0.2, et la version mineure du moteur doit être 8.0.2.2.27 ou ultérieure.
-
Les clusters **Standard Edition** doivent satisfaire aux conditions suivantes :
CPU architecture : x86.
Version du moteur de base de données : MySQL 8.0.1, et la version mineure du moteur doit être 8.0.1.1.45.2 ou ultérieure.
Pour interroger la version du cluster, consultez Interroger la version du moteur.
Remarques d'utilisation
La Multi-master Cluster (Limitless) EditionSeries et les clusters Serverless ne prennent pas en charge l'accélération automatique des requêtes basée sur IMCI.
-
Après avoir activé l'accélération automatique des requêtes basée sur IMCI :
Les frais liés aux nœuds d'index en colonnes en lecture seule ajoutés suivent les règles de facturation des nœuds de calcul standards.
Le système crée automatiquement des index en colonnes en fonction de vos instructions SQL lentes (les données d'index en colonnes occupent de l'espace de stockage).
Le système utilise la fonctionnalité SQL Trace pour enregistrer l'historique d'exécution des instructions SQL lentes. Dans la plupart des cas, cela ne consomme pas plus de 3 % des performances du nœud de base de données.
L'accélération automatique des requêtes basée sur IMCI utilise en interne le DDL non bloquant pour ajouter des index en colonnes. Le DDL non bloquant permet aux nouvelles transactions d'accéder à la table cible même lorsqu'un verrou MDL-X ne peut pas être obtenu, ce qui maintient la stabilité de l'ensemble du système métier. Pour plus d'informations, consultez Instructions DDL non bloquantes.
Activer l'accélération automatique des requêtes basée sur IMCI
Connectez-vous à la console PolarDB. Dans le volet de navigation de gauche, cliquez sur Clusters. Sélectionnez la Region où le cluster est déployé, puis cliquez sur l'ID du cluster pour accéder à la page des détails du cluster.
Sur la page Basic Information, repérez le champ Automatic IMCI-based Query Acceleration et cliquez sur Enable.
-
Les étapes suivantes diffèrent selon que le cluster actuel dispose ou non d'un nœud d'index en colonnes en lecture seule :
Si le cluster actuel possède déjà un nœud d'index en colonnes en lecture seule, dans la boîte de dialogue Enable Automatic IMCI-based Query Acceleration, cliquez sur OK pour activer l'accélération automatique des requêtes basée sur IMCI.
-
Si le cluster actuel ne possède pas de nœud d'index en colonnes en lecture seule, dans la boîte de dialogue Enable Automatic IMCI-based Query Acceleration, cliquez sur OK. Vous êtes redirigé vers la page d'ajout d'un nœud d'index en colonnes en lecture seule.
RemarqueAprès avoir cliqué sur OK, vous pouvez immédiatement Ajouter un nœud IMCI en lecture seule ou Ajouter un nœud IMCI en lecture seule manuellement ultérieurement.
Après avoir activé l'accélération automatique des requêtes basée sur IMCI, le cluster actuel doit contenir au moins un nœud d'index en colonnes en lecture seule. Sinon, même si Automatic IMCI-based Query Acceleration est défini sur Enable, le service d'accélération n'est pas fourni.
Après avoir activé l'accélération automatique des requêtes basée sur IMCI, si vous n'avez pas ajouté de nœud d'index en colonnes en lecture seule, le système utilise la fonctionnalité SQL Trace pour enregistrer l'historique d'exécution des instructions SQL lentes, mais ne crée pas d'index en colonnes. Par conséquent, aucun service d'accélération n'est fourni.
Désactiver l'accélération automatique des requêtes basée sur IMCI
Connectez-vous à la console PolarDB. Dans le volet de navigation de gauche, cliquez sur Clusters. Sélectionnez la Region où le cluster est déployé, puis cliquez sur l'ID du cluster pour accéder à la page des détails du cluster.
Sur la page Basic Information, repérez le champ Automatic IMCI-based Query Acceleration et cliquez sur Close.
Dans la boîte de dialogue Disable Automatic IMCI-based Query Acceleration, cliquez sur OK pour désactiver l'accélération automatique des requêtes basée sur IMCI.
La désactivation de l'accélération automatique des requêtes basée sur IMCI désactive uniquement les paramètres liés à la fonctionnalité. Les nœuds d'index en colonnes en lecture seule et leurs données sont conservés. Si vous n'avez plus besoin de conserver les nœuds d'index en colonnes en lecture seule ou les index en colonnes qu'ils contiennent, vous pouvez supprimer les nœuds d'index en colonnes en lecture seule dans la console, ou supprimer les index en colonnes à l'aide d'instructions SQL.