Le moteur SQL de Tablestore optimise les requêtes en sélectionnant le meilleur index pour la lecture des données et en déportant les calculs vers la couche d'index.
Sélection d'index
Lorsqu'une table de données dispose d'un Secondary index ou d'un Search index, le moteur SQL sélectionne le chemin de lecture optimal avant d'exécuter la requête. La sélection de l'index peut être automatique ou manuelle.
Avant d'utiliser l'optimisation des requêtes, assurez-vous d'avoir créé les mappages de tables de données. Pour plus d'informations, consultez les Opérations DDL. Pour accélérer les requêtes avec un index de recherche, créez également l'index de recherche et son mappage.
Règles de sélection automatique
Lorsque vous interrogez un mappage de table de données, le moteur SQL sélectionne automatiquement un index selon la priorité suivante :
|
Priorité |
Cible |
Condition |
|
1 |
Index de recherche |
Toutes les colonnes des clauses WHERE, d'agrégation et ORDER BY sont couvertes par le même index de recherche. Exemple : |
|
2 |
Index secondaire |
L'index secondaire correspond à davantage de colonnes de clé primaire principales dans la clause WHERE que la table de données (correspondance du préfixe gauche) et couvre toutes les colonnes de la requête. Exemple : La table de données possède les clés primaires a et b. Un index secondaire possède les clés primaires c, a et b. Pour |
|
3 |
Décision CBO |
Si aucune des règles précédentes ne s'applique, le moteur SQL utilise l'optimiseur interne CBO (Cost-Based Optimizer) pour sélectionner l'option au coût le plus faible entre la table de données et les index secondaires. |
Si le mappage est configuré avec une cohérence forte ou nécessite des résultats d'agrégation exacts, le moteur SQL ne sélectionne pas automatiquement un index de recherche.
Lorsqu'un index secondaire et un index de recherche couvrent tous deux les colonnes requises, le moteur SQL privilégie l'index de recherche.
Spécification manuelle d'un index
Pour utiliser un index spécifique, spécifiez-le manuellement de l'une des façons suivantes :
Syntaxe use index
Spécifiez un index dans l'instruction SELECT.
-- Force a full table scan (skip all indexes)
SELECT * FROM sampletable use index();
-- Use a search index
SELECT * FROM sampletable use index(sampletable_search_index);
-- Use a secondary index
SELECT * FROM sampletable use index(sampletable_secondary_index);
Si l'index spécifié ne couvre pas les colonnes requises, le moteur SQL lit automatiquement les données manquantes depuis la table de données.
Table de mappage d'index
Interrogez directement la table de mappage d'un index secondaire ou d'un index de recherche.
-- Query through a search index mapping table (only columns in the index are queryable)
SELECT col_a, col_b FROM search_index_mapping WHERE col_a > 10;
Les requêtes sur une table de mappage d'index ne peuvent retourner que les colonnes incluses dans l'index.
Recommandations
|
Scénario |
Recommandation |
|
Agrégation, tri ou recherche en texte intégral |
Utilisez la sélection automatique (par défaut). Assurez-vous que l'index de recherche couvre toutes les colonnes requises. Le moteur SQL achemine la requête vers l'index de recherche et délègue les opérateurs automatiquement. |
|
Filtres simples d'égalité ou de plage avec cohérence forte |
Utilisez un index secondaire. Les index secondaires prennent en charge les lectures fortement cohérentes lorsque vous avez besoin de données en temps réel. |
|
La sélection automatique produit des résultats inattendus |
Spécifiez manuellement un index avec |
|
Seules les colonnes de l'index sont nécessaires |
Interrogez directement la table de mappage d'index pour éviter de lire la table de données. |
Délégation de calcul
Le moteur SQL délègue les opérateurs pris en charge vers la couche d'index de recherche, réduisant ainsi le volume de données qu'il doit traiter.
Conditions d'activation
La délégation de calcul nécessite que l'index de recherche couvre toutes les colonnes de l'instruction SQL, y compris les colonnes SELECT, WHERE, ORDER BY et GROUP BY. Si une colonne est manquante, le moteur SQL revient à une analyse complète de la table.
-- Table has columns a, b, c, d. Search index covers a, b, c.
-- d is not in the search index → full table scan, no pushdown
SELECT a, b, c, d FROM exampletable;
-- All columns are in the search index → reads through search index, pushdown supported
SELECT a, b, c FROM exampletable;
Opérateurs pris en charge
|
Type d'opérateur |
Prise en charge de la délégation |
Conditions |
|
Opérateurs logiques |
AND, OR |
<!--@p {"id":"afe6389efb57"}--br>NOT ne peut pas être délégué. |
|
Opérateurs relationnels |
=, !=, <, <=, >, >=, BETWEEN...AND |
Seules les comparaisons colonne-constante sont prises en charge. Les comparaisons colonne-colonne ne peuvent pas être déléguées, car les index de recherche construisent des index indépendants par colonne et ne peuvent pas résoudre les comparaisons inter-colonnes au niveau de l'index. |
|
Fonctions d'agrégation |
MIN, MAX, COUNT, AVG, SUM, ANY_VALUE, COUNT(DISTINCT), GROUP BY |
Les arguments doivent être des noms de colonnes, pas des expressions. COUNT(*) prend en charge la délégation. |
|
Tri et pagination |
ORDER BY col LIMIT n |
Les arguments ORDER BY doivent être des noms de colonnes. Les expressions dans ORDER BY ne peuvent pas être déléguées. |
|
Fonctions vectorielles |
VECTOR_QUERY_FLOAT32 |
Toutes les autres expressions de la clause WHERE doivent également satisfaire aux conditions de délégation. Si une expression ne les satisfait pas, la requête ne peut pas s'exécuter. |
Anti-modèles courants
|
Anti-modèle |
Modèle corrigé |
Raison |
|
|
La colonne a est de type BIGINT. Une incompatibilité de type déclenche un CAST implicite. |
|
|
L'argument d'agrégation est une expression. |
|
|
L'argument GROUP BY est une expression. |
|
Aucune réécriture équivalente. Filtrez au niveau de la couche application. |
Comparaison colonne-colonne. |
|
|
L'argument ORDER BY est une expression. |
Mappage des expressions SQL et des fonctionnalités d'index de recherche
Le tableau suivant mappe les expressions SQL à leurs fonctionnalités de requête d'index de recherche équivalentes, ce qui vous aide à migrer depuis le SDK d'index de recherche vers SQL.
|
Expression SQL |
Exemple |
Fonctionnalité d'index de recherche |
|
Aucune clause WHERE |
SELECT * FROM t |
|
|
= |
a = 1 |
|
|
>, >=, <, <= |
a > 1 |
|
|
IS NULL / IS NOT NULL |
a IS NULL |
|
|
AND / OR / NOT / != |
a = 1 AND b = 2 |
|
|
LIKE |
a LIKE "%s%" |
|
|
IN |
a IN (1,2,3) |
|
|
TEXT_MATCH |
TEXT_MATCH(a, "hello") |
|
|
TEXT_MATCH_PHRASE |
TEXT_MATCH_PHRASE(a, "hello world") |
|
|
ARRAY_EXTRACT |
ARRAY_EXTRACT(col) |
|
|
NESTED_QUERY |
NESTED_QUERY(expr) |
|
|
ORDER BY / LIMIT |
ORDER BY a LIMIT 10 |
|
|
Fonctions d'agrégation / GROUP BY |
SUM(col) / GROUP BY col |