

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

# Unterschiede zwischen einer relationalen (SQL) Datenbank und DynamoDB beim Verwalten von Indizes
<a name="SQLtoNoSQL.Indexes"></a>

Indexe ermöglichen Ihnen den Zugriff auf alternative Abfragemuster und können Abfragen beschleunigen. In diesem Abschnitt werden die Indexerstellung und -verwendung in SQL und Amazon DynamoDB verglichen und gegenübergestellt.

Ganz gleich, ob Sie eine relationale Datenbank oder DynamoDB verwenden, sollten Sie bei der Indexerstellung mit Bedacht vorgehen. Bei jedem Schreibvorgang in einer Tabelle müssen alle Indexe der Tabelle aktualisiert werden. In einer Umgebung mit vielen Schreibvorgängen und großen Tabellen können dadurch große Mengen von Systemressourcen belegt werden. In schreibgeschützten Umgebungen (bzw. Umgebungen, indenen Daten vor allem gelesen werden) stellt dies kein Problem dar. Sie sollten jedoch sicherstellen, dass die Indexe tatsächlich von der Anwendung verwendet werden und nicht nur Speicherplatz belegen.

**Topics**
+ [Unterschiede zwischen einer relationalen (SQL) Datenbank und DynamoDB beim Erstellen eines Index](#SQLtoNoSQL.Indexes.Creating)
+ [Unterschiede zwischen einer relationalen (SQL) Datenbank und DynamoDB beim Abfragen und Scannen eines Index](#SQLtoNoSQL.Indexes.QueryAndScan)

## Unterschiede zwischen einer relationalen (SQL) Datenbank und DynamoDB beim Erstellen eines Index
<a name="SQLtoNoSQL.Indexes.Creating"></a>

Vergleichen Sie die Anweisung `CREATE INDEX` in SQL mit der Operation `UpdateTable` in Amazon DynamoDB.

**Topics**
+ [Erstellen eines Index mit SQL](#SQLtoNoSQL.Indexes.Creating.SQL)
+ [Erstellen eines Index in DynamoDB](#SQLtoNoSQL.Indexes.Creating.DynamoDB)

### Erstellen eines Index mit SQL
<a name="SQLtoNoSQL.Indexes.Creating.SQL"></a>

In einer relationalen Datenbank ist ein Index eine Datenstruktur, mit der Sie schnelle Abfragen für verschiedene Spalten einer Tabelle ausführen können. Mit der SQL-Anweisung `CREATE INDEX` können Sie einer vorhandenen Tabelle einen Index hinzufügen, indem Sie die zu indizierenden Spalten angeben. Nachdem der Index erstellt wurde, können Sie die Daten in der Tabelle wie üblich abfragen. Die Datenbank kann die angegebenen Zeilen in der Tabelle anhand des Index schnell finden, sodass nicht die gesamte Tabelle gescannt werden muss.

Nachdem Sie einen Index erstellt haben, wird dieser von der Datenbank gepflegt. Sobald Sie Daten in der Tabelle ändern, wird der Index automatisch den Änderungen in der Tabelle entsprechend angepasst.

In MySQL können Sie einen Index wie den folgenden erstellen:

```
CREATE INDEX GenreAndPriceIndex
ON Music (genre, price);
```

### Erstellen eines Index in DynamoDB
<a name="SQLtoNoSQL.Indexes.Creating.DynamoDB"></a>

In DynamoDB können Sie einen *sekundären Index* für ähnliche Zwecke erstellen und verwenden.

Indexe in DynamoDB unterscheiden sich von ihren relationalen Gegenstücken. Wenn Sie einen sekundären Index erstellen, müssen Sie dessen Schlüsselattribute angeben – einen Partitionsschlüssel und einen Sortierschlüssel. Nachdem Sie den sekundären Index erstellt haben, können Sie `Query` oder `Scan` wie bei einer Tabelle erstellen. DynamoDB bietet keinen Abfrageoptimierer, sodass ein sekundärer Index nur bei der `Query`- oder `Scan`-Aktion verwendet wird.

DynamoDB unterstützt zwei verschiedene Arten von Indexen:
+ Globale sekundäre Indizes – Der Primärschlüssel des Index kann aus zwei beliebigen Attributen der Tabelle bestehen. 
+ Lokale sekundäre Indizes – Der Partitionsschlüssel des Index muss mit dem Partitionsschlüssel der Tabelle übereinstimmen. Der Sortierschlüssel kann ein beliebiges, anderes Attribut sein.

DynamoDB stellt sicher, dass die Daten in einem sekundären Index schließlich mit seiner Tabelle konsistent sind. Sie können stark konsistente `Query`- oder `Scan`-Aktionen für eine Tabelle oder einen lokalen sekundären Index anfordern. Globale sekundäre Indizes unterstützen jedoch nur die letztendliche Datenkonsistenz.

Sie können einer vorhandenen Tabelle einen globalen sekundären Index hinzufügen, indem Sie die `UpdateTable`-Aktion verwenden und `GlobalSecondaryIndexUpdates` angeben.

```
{
    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
                }
            }
        }
    ]
}
```

Sie müssen die folgenden Parameter für `UpdateTable` angeben:
+ `TableName` – Die Tabelle, mit der der Index verknüpft wird.
+ `AttributeDefinitions` – Die Datentypen für die Schlüsselschemaattribute des Index.
+ `GlobalSecondaryIndexUpdates` – Details zu dem Index, den Sie erstellen möchten:
  + `IndexName` – Ein Name für den Index.
  + `KeySchema` – Die Attribute, die für den Indexprimärschlüssel verwendet werden.
  + `Projection` – Attribute aus der Tabelle, die in den Index kopiert werden. In diesem Fall bedeutet `ALL`, dass alle Attribute kopiert werden.
  + `ProvisionedThroughput (for provisioned tables)` – Die Anzahl der Lese- und Schreibvorgänge pro Sekunde, die Sie für diesen Index benötigen. (Dieser Wert steht nicht mit den Einstellungen für den bereitgestellten Durchsatz der Tabelle in Zusammenhang.) 

Ein Teil dieser Operation umfasst das Abgleichen von Daten aus der Tabelle mit dem neuen Index. Während des Abgleichs ist die Tabelle weiterhin verfügbar. Der Index ist allerdings erst bereit, wenn sich das Attribut `Backfilling` von TRUE in FALSE ändert. Sie können die Aktion `DescribeTable` zum Anzeigen dieses Attributs verwenden.

## Unterschiede zwischen einer relationalen (SQL) Datenbank und DynamoDB beim Abfragen und Scannen eines Index
<a name="SQLtoNoSQL.Indexes.QueryAndScan"></a>

Vergleichen Sie das Abfragen und Scannen eines Index mithilfe der SELECT-Anweisung in SQL mit den Operationen `Query` und `Scan` in Amazon DynamoDB.

**Topics**
+ [Abfragen und Scannen eines Index mit SQL](#SQLtoNoSQL.Indexes.QueryAndScan.SQL)
+ [Abfragen und Scannen eines Index in DynamoDB](#SQLtoNoSQL.Indexes.QueryAndScan.DynamoDB)

### Abfragen und Scannen eines Index mit SQL
<a name="SQLtoNoSQL.Indexes.QueryAndScan.SQL"></a>

In einer relationalen Datenbank arbeiten Sie nicht direkt mit Indexen. Stattdessen fragen Sie Tabellen mithilfe von `SELECT`-Anweisungen ab. Der Abfrageoptimierer kann jeden beliebigen Index nutzen.

Ein *Abfrageoptimierer* ist eine Komponente eines relationalen Datenbankmanagementsystems (RDBMS), die verfügbare Indexe auswertet und bestimmt, ob diese zum Beschleunigen einer Abfrage verwendet werden können. Wenn die Indexe zum Beschleunigen einer Abfrage verwendet werden können, greift das RDBMS zuerst auf den Index zu und sucht damit die Daten in der Tabelle.

Im Folgenden finden Sie einige SQL-Anweisungen, mit denen Sie die Leistung verbessern können *GenreAndPriceIndex*. Wir setzen voraus, dass die Tabelle *Musik* genügend Daten enthält, damit der Abfrageoptimierer diesen Index verwendet, statt die gesamte Tabelle einfach zu scannen.

```
/* 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;
```

### Abfragen und Scannen eines Index in DynamoDB
<a name="SQLtoNoSQL.Indexes.QueryAndScan.DynamoDB"></a>

In DynamoDB führen Sie `Query` und `Scan`-Operationen direkt für den Index aus, genauso wie für eine Tabelle. Sie können entweder die DynamoDB-API verwenden oder [PartiQL](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ql-reference.html), eine SQL-kompatiblen Abfragesprache, um den Index abzufragen oder zu scannen. Sie müssen sowohl `TableName` als auch `IndexName` angeben.

Im Folgenden finden Sie einige Abfragen *GenreAndPriceIndex*in DynamoDB. (Das Schlüsselschema für diesen Index besteht aus *Genre* und *Preis*.)

------
#### [ DynamoDB API ]

```
// All of the rock songs

{
    TableName: "Music",
    IndexName: "GenreAndPriceIndex",
    KeyConditionExpression: "Genre = :genre",
    ExpressionAttributeValues: {
        ":genre": "Rock"
    },
};
```

In diesem Beispiel wird ein `ProjectionExpression` verwendet, um anzugeben, dass nicht alle, sondern nur einige Attribute in den Ergebnissen enthalten sein sollen.

```
// 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"
};
```

Im Folgenden ist ein Scan aktiviert. *GenreAndPriceIndex*

```
// Return all of the data in the index

{
    TableName:  "Music",
    IndexName: "GenreAndPriceIndex"
}
```

------
#### [ PartiQL for DynamoDB ]

Mit PartiQL verwenden Sie die PartiQL `Select`-Anweisung zur Durchführung von Abfragen und Scans für den 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
```

Das Folgende ist ein Scan aktiviert *GenreAndPriceIndex*.

```
// Return all of the data in the index

SELECT *
FROM Music.GenreAndPriceIndex
```

**Anmerkung**  
Codebeispiele, die `Select` verwenden, finden Sie unter [PartiQL-Select-Anweisungen für DynamoDB](ql-reference.select.md).

------