L'In-Memory Column Index (IMCI) ajoute une couche de stockage en colonnes et de calcul en mémoire à PolarDB for MySQL. Cette fonctionnalité permet le traitement hybride transactionnel et analytique (HTAP) sur un seul cluster, sans sacrifier les performances OLTP ni exiger la migration de vos données.
Pourquoi MySQL nécessite un stockage en colonnes
MySQL a été conçu pour le traitement des transactions en ligne (OLTP) : recherches par ligne unique, écritures concurrentes et transactions à faible latence. Les clusters PolarDB stockant couramment des centaines de téraoctets, les utilisateurs ont de plus en plus besoin d'analyses en temps réel sur les mêmes données que celles qui alimentent leurs applications. Trois approches architecturales ont émergé pour répondre à ce besoin.
MySQL + base de données AP dédiée
Cette approche déploie deux systèmes distincts — MySQL pour l'OLTP et une base de données OLAP spécialisée pour l'analytique — reliés par un pipeline de synchronisation. Bien qu'elle offre le meilleur moteur pour chaque charge de travail, son coût reste élevé : maintenance de deux piles technologiques, latence de synchronisation rendant les données analytiques obsolètes, et absence de chemin simple vers une cohérence en temps réel.

Conception divergente multi-réplicas
Les bases de données NewSQL distribuées comme TiDB (à partir de la version 4.0) attribuent différents formats de stockage aux réplicas au sein de chaque groupe Raft. Un réplica exécute TiFlash, un stockage en colonnes, pour traiter les requêtes analytiques, tandis que les autres gèrent l'OLTP. Un routage intelligent sélectionne automatiquement le réplica approprié. Cette solution fonctionne bien pour les nouveaux déploiements, mais exige une migration depuis MySQL, source de problèmes de compatibilité.

Stockage hybride ligne-colonne intégré
L'approche la plus avancée stocke simultanément des données orientées lignes et colonnes dans la même instance de base de données. Toutes les grandes bases de données commerciales utilisent cette conception :
Oracle a introduit la suite Database In-Memory dans Oracle Database 12c (2013), exploitant un stockage en colonnes en mémoire avec une exécution hybride ligne-colonne et des optimisations de requêtes basées sur des expressions matérialisées et JoinGroup.
SQL Server a ajouté les index columnstore dans SQL Server 2016 SP1, prenant en charge les tables orientées lignes, les tables orientées colonnes et les combinaisons hybrides.
IBM Db2 a livré BLU Acceleration dans Kepler 10.5 (2013), combinant stockage en colonnes, calcul en mémoire et saut de données (data skipping).

Ces trois systèmes ont convergé vers cette conception pour la même raison : un stockage en colonnes offre une meilleure efficacité d'E/S (compression, saut de données, élagage de colonnes) et une meilleure efficacité CPU (modèles d'accès favorables au cache). Cependant, les index de stockage en colonnes sont clairsemés et ne permettent pas de localiser efficacement des lignes individuelles comme le ferait un index B+ tree. Un moteur hybride ligne-colonne résout ce problème : le stockage en lignes gère l'OLTP avec une indexation précise au niveau de la ligne, tandis que le stockage en colonnes accélère les scans analytiques en masse. La faible latence de la DRAM compense l'écart de performance lors des mises à jour du stockage en colonnes.
Pourquoi PolarDB nécessitait un nouveau moteur d'exécution
La pile de capacités de PolarDB reflète celle de MySQL open source. Bien que PolarDB gère efficacement l'OLTP et prenne en charge jusqu'à 500 To de données par cluster, les requêtes analytiques complexes restent lentes. Ces goulots d'étranglement sont inhérents à l'architecture de MySQL :
Modèle d'exécution en série. Le modèle d'itérateur Volcan de MySQL traite une ligne à la fois. Chaque récupération de ligne déclenche plusieurs couches d'appels de fonctions, y compris la distribution de fonctions virtuelles. Cela nuit à l'efficacité du pipeline CPU et empêche l'utilisation des instructions SIMD.
Absence de requête parallèle. L'exécuteur de MySQL est monothread. La prise en charge des requêtes parallèles dans MySQL 8.0 ne couvre que des opérations de base telles que
COUNT(*); les requêtes SQL analytiques complexes s'exécutent en série, quel que soit le nombre de cœurs CPU disponibles.Gaspillage d'E/S du stockage en lignes. Lorsqu'une requête analytique n'a besoin que de 3 colonnes d'une table de 50 colonnes, MySQL lit tout de même les 50 colonnes depuis le disque. Le format de stockage en lignes rend l'accès sélectif aux colonnes intrinsèquement inefficace.
Le framework de requêtes parallèles de PolarDB répond au goulot d'étranglement CPU en répartissant le travail de scan sur plusieurs threads et en agrégeant les résultats sur le thread principal :

La requête parallèle brise le plafond du cœur unique et réduit le temps de requête pour les charges de travail intensives en scans. Toutefois, l'inefficacité des E/S du stockage en lignes impose une limite que l'exécution parallèle seule ne peut franchir. Seul un stockage en colonnes permet d'éliminer ce plafond.
Un stockage en colonnes améliore les performances à deux niveaux :
Efficacité des E/S. Les requêtes ne lisent que les colonnes nécessaires. Les données en colonnes se compressent avec une efficacité supérieure à 10x par rapport au stockage en lignes. Combiné à des index approximatifs (statistiques MIN/MAX par bloc de données), cela permet de sauter de grands blocs de données non pertinentes avant la décompression. Dans l'architecture à séparation calcul-stockage de PolarDB, la réduction des données transférées sur le réseau accélère directement la réponse aux requêtes.
Efficacité CPU. Le stockage contigu des données en colonnes améliore les taux de réussite du cache CPU et réduit les arrêts dus aux défauts de cache L1/L2. Cette contiguïté permet également la vectorisation SIMD, multipliant ainsi le débit sur un seul cœur.
Termes clés
| Terme | Définition |
|---|---|
| IMCI | In-Memory Column Index. Implémentation par PolarDB d'un stockage hybride ligne-colonne. |
| Index colonnaire | Index secondaire dans InnoDB stockant les données en format colonnaire plutôt qu'en format ligne. |
| Groupe de lignes | Unité d'organisation des données dans un index colonnaire. Chaque groupe contient 64 000 lignes. |
| Data pack | Données d'une seule colonne au sein d'un groupe de lignes, stockées de manière contiguë et compressée. |
| Index approximatif | Statistiques précalculées (MIN, MAX, SUM, nombre de valeurs nulles, nombre de lignes) pour chaque data pack, utilisées pour sauter les data packs non pertinents sans les décompresser. |
| Zone de stockage en colonnes en mémoire | Région mémoire où les data packs actifs sont mis en cache pour l'exécution des requêtes. Les données en colonnes sont compressées sur le disque et mises en cache ici. |
| Degré de parallélisme (DOP) | Nombre de threads parallèles utilisés pour exécuter une requête. Le DOP automatique sélectionne cette valeur automatiquement en fonction des ressources système. |
| Modèle Volcan | Modèle d'exécution de requêtes où chaque opérateur expose une interface Next(), extrayant les données des opérateurs enfants une ligne (ou un lot) à la fois. |
| Exécution vectorisée | Variante du modèle Volcan où chaque appel Next() renvoie un lot de lignes plutôt qu'une seule ligne, permettant l'accélération SIMD. |
Fonctionnement de l'IMCI
L'IMCI combine quatre innovations techniques :
Index columnaires dans InnoDB. Créez des index columnaires sur des colonnes sélectionnées à l'aide d'instructions DDL. Ces index utilisent un stockage compressé en colonnes — nettement plus compact que le stockage en lignes — et résident par défaut dans la zone de stockage en colonnes en mémoire. En cas de mémoire insuffisante, ils débordent sur le stockage partagé.
Moteur d'exécution orienté colonnes. L'exécuteur de PolarDB accède aux données par lots de 4 096 lignes et applique des instructions SIMD pour traiter plusieurs valeurs en une seule opération CPU. Tous les opérateurs clés (Scan, Hash Join, Nested Loop Join, Group By) prennent en charge l'exécution parallèle. Comparé à l'exécuteur en lignes de MySQL, l'exécuteur en colonnes offre des performances supérieures de plusieurs ordres de grandeur sur les charges de travail analytiques.
Optimiseur hybride ligne-colonne. Lors de la soumission d'une requête, l'optimiseur évalue le coût de trois chemins d'exécution — exécution en série sur stockage en lignes, requête parallèle sur stockage en lignes, et IMCI — et sélectionne le plan le moins coûteux. Un mécanisme de liste d'autorisation garantit que les requêtes utilisant des types de colonnes ou des opérateurs non pris en charge basculent automatiquement vers le stockage en lignes, préservant ainsi une compatibilité MySQL à 100 %.
Isolation des charges de travail AP/TP. Configurez un nœud en lecture seule (RO) dédié comme nœud analytique avec des index columnaires. Les requêtes analytiques s'exécutent sur le nœud RO en utilisant toutes les ressources CPU et mémoire disponibles, sans impact sur les charges de travail OLTP s'exécutant sur les nœuds en lecture/écriture (RW).

Architecture technique
Optimiseur hybride ligne-colonne
Moteur d'exécution orienté colonnes
Le moteur d'exécution IMCI est une réécriture complète, indépendante de l'exécuteur en lignes de MySQL. Son objectif est d'éliminer deux goulots d'étranglement fondamentaux : la surcharge des fonctions virtuelles par ligne et l'incapacité à paralléliser l'exécution.
Exécuteur parallèle vectorisé
Système d'expressions vectorisé
Stockage hybride ligne-colonne
Performances OLAP
Pour les résultats des benchmarks, consultez Performances de l'IMCI.











