Différences entre une base de données relationnelle (SQL) et DynamoDB lors de la gestion des index - Amazon DynamoDB

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Différences entre une base de données relationnelle (SQL) et DynamoDB lors de la gestion des index

Les index donnent accès à d'autres modèles de requête et peuvent accélérer les requêtes. Cette section compare et met en contraste la création et l'utilisation d'index dans SQL Amazon DynamoDB.

Que vous utilisiez une base de données relationnelle ou DynamoDB, vous devez recourir à la création d'index judicieusement. Chaque fois qu'une écriture se produit sur une table, tous les index de la table doivent être mis à jour. Dans un environnement à forte densité d'écritures avec de grandes tables, cette opération peut consommer d'importantes quantité de ressources système. Dans un environnement en lecture seule ou principalement en lecture, ce risque est moins important. Cependant, vous devez vous assurer que les index sont effectivement utilisés par votre application et pas simplement qu'ils occupent de l'espace.

Différences entre une base de données relationnelle (SQL) et DynamoDB lors de la création d'un index

Comparez l'CREATE INDEXinstruction SQL avec l'UpdateTableopération dans Amazon DynamoDB.

Création d'un index avec SQL

Dans une base de données relationnelle, un index est une structure de données qui vous permet d'exécuter des requêtes rapides sur différentes colonnes d'une table. Vous pouvez utiliser l'CREATE INDEXSQLinstruction pour ajouter un index à une table existante, en spécifiant les colonnes à indexer. Une fois que l'index a été créé, vous pouvez interroger les données de la table comme à l'habitude, mais maintenant la base de données peut utiliser l'index pour retrouver rapidement les lignes spécifiées dans le tableau au lieu d'analyser la totalité de la table.

Une fois que vous créez un index, la base de données le gère automatiquement. Chaque fois que vous modifiez les données de la table, l'index est automatiquement modifié pour refléter les modifications de la table.

Dans MySQL, vous créeriez un index comme celui-ci.

CREATE INDEX GenreAndPriceIndex ON Music (genre, price);

Création d'un index dans DynamoDB

Dans DynamoDB, vous pouvez créer et utiliser un index secondaire à des fins similaires.

Les index dans DynamoDB sont différents de leurs équivalents relationnels. Lorsque vous créez un index secondaire, vous devez spécifier ses attributs de clé, c'est-à-dire une clé de partition et une clé de tri. Après avoir créé l'index secondaire, vous pouvez effectuer une opération Query ou Scan sur celui-ci, comme vous le feriez avec une table. DynamoDB n'ayant pas d'optimiseur de requête, un index secondaire n'est utilisé que lorsque vous effectuez une opération Query ou Scan sur celui-ci.

DynamoDB prend en charge deux types d'index :

  • Index secondaires globaux – La clé primaire de l'index peut être constituée de deux attributs quelconques de sa table.

  • Index secondaires locaux – La clé de partition de l'index doit être la même que la clé de partition de sa table. Cependant, la clé de tri peut être n'importe quel autre attribut.

DynamoDB veille à ce que les données dans un index secondaire soient éventuellement cohérentes avec sa table. Vous pouvez demander des opérations Query ou Scan fortement cohérentes sur une table ou un index secondaire local. Cependant, les index secondaires globaux ne prennent en charge que la cohérence éventuelle.

Vous pouvez ajouter un index secondaire global à une table existante à l'aide de l'opération UpdateTable et en spécifiant GlobalSecondaryIndexUpdates.

{ TableName: "Music", AttributeDefinitions:[ {AttributeName: "Genre", AttributeType: "S"}, {AttributeName: "Price", AttributeType: "N"} ], GlobalSecondaryIndexUpdates: [ { Create: { IndexName: "GenreAndPriceIndex", KeySchema: [ {AttributeName: "Genre", KeyType: "HASH"}, //Partition key {AttributeName: "Price", KeyType: "RANGE"}, //Sort key ], Projection: { "ProjectionType": "ALL" }, ProvisionedThroughput: { // Only specified if using provisioned mode "ReadCapacityUnits": 1,"WriteCapacityUnits": 1 } } } ] }

Vous devez fournir les paramètres suivants à UpdateTable :

  • TableName – Table à laquelle l'index sera associé.

  • AttributeDefinitions – Types de données pour les attributs de schéma de clé de l'index.

  • GlobalSecondaryIndexUpdates – Détails sur l'index que vous souhaitez créer :

    • IndexName – Nom pour l'index.

    • KeySchema – Attributs utilisés pour la clé primaire de l'index.

    • Projection – Attributs de la table qui sont copiés dans l'index. Dans ce cas, ALL signifie que tous les attributs sont copiés.

    • ProvisionedThroughput (for provisioned tables) – Nombre de lectures et d'écritures par seconde nécessaires pour ce index. (Cette information est distincte des paramètres de débit alloué de la table.)

Une partie de cette opération implique le renvoi de données de la table vers le nouvel index. Pendant le renvoi, la table demeure disponible. Cependant, l'index n'est pas prêt jusqu'à ce que son attribut Backfilling passe de true à false. Vous pouvez utiliser l'opération DescribeTable pour afficher cet attribut.

Différences entre une base de données relationnelle (SQL) et DynamoDB lors de l'interrogation et de l'analyse d'un index

Comparez l'interrogation et l'analyse d'un index à l'aide de l'SELECTinstruction in SQL avec les Scan opérations Query et dans Amazon DynamoDB.

Interrogation et analyse d'un index avec SQL

Dans une base de données relationnelle, vous n'utilisez pas directement les index. Au lieu de cela, vous interrogez les tables à l'aide d'instructions SELECT et l'optimiseur de requête peut utiliser tous les index.

Un optimiseur de requêtes est un composant du système de gestion de base de données relationnelle (RDBMS) qui évalue les index disponibles et détermine s'ils peuvent être utilisés pour accélérer une requête. Si les index peuvent être utilisés pour accélérer une requête, il RDBMS accède d'abord à l'index, puis l'utilise pour localiser les données dans la table.

Voici quelques SQL instructions qui peuvent être utilisées GenreAndPriceIndexpour améliorer les performances. Nous supposons que la table Music possède suffisamment de données pour que l'optimiseur de requête décide d'utiliser cet index, plutôt que de simplement analyser la totalité de la table.

/* All of the rock songs */ SELECT * FROM Music WHERE Genre = 'Rock';
/* All of the cheap country songs */ SELECT Artist, SongTitle, Price FROM Music WHERE Genre = 'Country' AND Price < 0.50;

Interrogation et analyse d'un index dans DynamoDB

Dans DynamoDB, vous effectuez les opérations Query et Scan directement sur l'index, de la même manière que vous le feriez sur une table. Vous pouvez utiliser API DynamoDB ou partiQL SQL (un langage de requête compatible) pour interroger ou scanner l'index. Vous devez spécifier à la fois TableName et IndexName.

Voici quelques requêtes effectuées GenreAndPriceIndexdans DynamoDB. (Le schéma de clé de l'index est composé de Genre et de Price.)

DynamoDB API
// All of the rock songs { TableName: "Music", IndexName: "GenreAndPriceIndex", KeyConditionExpression: "Genre = :genre", ExpressionAttributeValues: { ":genre": "Rock" }, };

Cet exemple utilise une ProjectionExpression pour indiquer que vous souhaitez que certains attributs seulement, et non leur totalité, apparaissent dans les résultats.

// All of the cheap country songs { TableName: "Music", IndexName: "GenreAndPriceIndex", KeyConditionExpression: "Genre = :genre and Price < :price", ExpressionAttributeValues: { ":genre": "Country", ":price": 0.50 }, ProjectionExpression: "Artist, SongTitle, Price" };

Ce qui suit est un scan en cours GenreAndPriceIndex.

// Return all of the data in the index { TableName: "Music", IndexName: "GenreAndPriceIndex" }
PartiQL for DynamoDB

Avec PartiQL, vous utilisez l'instruction PartiQL Select pour interroger et analyser l'index.

// All of the rock songs SELECT * FROM Music.GenreAndPriceIndex WHERE Genre = 'Rock'
// All of the cheap country songs SELECT * FROM Music.GenreAndPriceIndex WHERE Genre = 'Rock' AND Price < 0.50

Ce qui suit est un scan en cours GenreAndPriceIndex.

// Return all of the data in the index SELECT * FROM Music.GenreAndPriceIndex
Note

Pour obtenir des exemples de code utilisant Select, consultez Instructions PartiQL de sélection pour DynamoDB.