Lorsqu'un cluster HTAP PolarDB for MySQL traite simultanément des charges OLTP et OLAP, le mélange de ces deux types de trafic sur un même endpoint de cluster peut entraîner une compétition pour les ressources entre les requêtes de stockage en ligne et les requêtes analytiques. Pour isoler le trafic, configurez des endpoints de cluster distincts : l'un dédié aux nœuds de stockage en ligne pour l'OLTP, l'autre aux nœuds de stockage en colonne pour l'OLAP. Dirigez ensuite chaque application vers l'endpoint approprié.
Fonctionnement du routage
PolarDB répartit les requêtes selon trois couches. Comprendre leur ordre d'application permet de déterminer où intervenir lorsque le routage ne se comporte pas comme prévu.
| Couche | Mécanisme | Portée |
|---|---|---|
| 1. Endpoint de cluster | Restreint les nœuds accessibles par un endpoint | Niveau connexion |
| 2. Optimisation basée sur les coûts | Sélectionne un plan d'exécution en stockage ligne ou colonne selon le coût estimé | Niveau instruction (automatique) |
| 3. Hint SQL | Force un plan d'exécution spécifique, en outrepassant l'optimisation basée sur les coûts | Niveau instruction (manuel) |
En conditions normales, la couche 1 sépare le trafic OLTP du trafic OLAP, tandis que la couche 2 gère automatiquement la sélection des plans. N'utilisez la couche 3 que si la sélection automatique produit des résultats inattendus pour une instruction donnée.
Les règles de routage par défaut sont les suivantes :
Requêtes d'écriture OLTP : toujours dirigées vers le nœud principal.
Requêtes de lecture OLTP : acheminées vers les nœuds de stockage en ligne en lecture seule ou vers le nœud principal.
Requêtes de lecture OLAP : envoyées aux nœuds de stockage en colonne en lecture seule.

Configuration des endpoints de cluster
Configurez deux endpoints de cluster : l'un pour le trafic OLTP, l'autre pour le trafic OLAP. Pour plus d'informations sur la création et la gestion des endpoints de cluster, consultez Gérer les endpoints d'un cluster.
Endpoint OLTP
Choisissez l'un des modes suivants :
| Mode | Configuration des nœuds |
|---|---|
| Read-only | Ajoutez uniquement des nœuds de stockage en ligne en lecture seule à la liste des nœuds sélectionnés. |
| Read/Write (Automatic Read/Write Splitting) | Ajoutez au moins un nœud de stockage en ligne en lecture seule. Si l'option Primary Node Accepts Read Requests est définie sur Yes, les requêtes de lecture sont également réparties sur le nœud principal. |
Dans le mode Read/Write (Automatic Read/Write Splitting), toutes les requêtes d'écriture sont envoyées au nœud principal, que celui-ci figure ou non dans la liste des nœuds sélectionnés.
Endpoint OLAP
Les charges de travail OLAP ne comportent que des requêtes de lecture. Utilisez le mode Read-only et ajoutez au moins un nœud de stockage en colonne en lecture seule à la liste des nœuds sélectionnés.
Outrepasser le routage avec des hints SQL
Une fois qu'une instruction atteint un nœud de stockage en colonne en lecture seule, PolarDB compare le coût d'exécution estimé au paramètre loose_cost_threshold_for_imci afin de déterminer le plan d'exécution. Si le coût dépasse ce seuil, PolarDB utilise le plan de stockage en colonne via l'index en mémoire IMCI (In-Memory Column Index) ; sinon, il applique le plan de stockage en ligne.
Pour contourner cette sélection automatique pour une instruction spécifique, ajoutez un hint SQL. Ce hint s'applique exclusivement à l'instruction qu'il annote : il n'affecte ni les autres instructions de la même connexion, ni celles des autres connexions.
Pour MySQL 5.7.7 et versions antérieures, ajoutez l'option --comments lors de la connexion au moteur de base de données. Sans cela, le client supprime les hints avant d'envoyer l'instruction. Exécutez mysql --version pour vérifier la version de votre client.
Forcer un plan d'exécution en stockage colonne
Ajoutez /*+ SET_VAR(cost_threshold_for_imci=0) */ pour définir le seuil de coût à 0, ce qui force l'utilisation du plan de stockage en colonne quel que soit le coût réellement estimé.
/*FORCE_IMCI_NODES*/EXPLAIN SELECT /*+ SET_VAR(cost_threshold_for_imci=0) */ COUNT(*) FROM t1 WHERE t1.a > 1;
À l'intérieur de /*+SET_VAR()*/, omettez le préfixe loose_ du nom du paramètre. L'utilisation de loose_cost_threshold_for_imci dans le hint rend celui-ci inopérant ; utilisez plutôt cost_threshold_for_imci.
Forcer un plan d'exécution en stockage ligne
Ajoutez /*+ SET_VAR(USE_IMCI_ENGINE=OFF) */ pour contourner entièrement le moteur de stockage en colonne.
EXPLAIN SELECT /*+ SET_VAR(USE_IMCI_ENGINE=OFF) */ COUNT(*) FROM t1 WHERE t1.a > 1;