Perbedaan antara database relasional (SQL) dan DynamoDB saat mengelola indeks - Amazon DynamoDB

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Perbedaan antara database relasional (SQL) dan DynamoDB saat mengelola indeks

Indeks memberikan Anda akses ke pola kueri alternatif, dan dapat mempercepat kueri. Bagian ini membandingkan dan membedakan pembuatan dan penggunaan indeks di SQL dan Amazon DynamoDB.

Entah Anda menggunakan basis data relasional atau DynamoDB, Anda harus bijaksana dengan pembuatan indeks. Setiap kali sebuah peristiwa tulis terjadi pada tabel, semua indeks tabel harus diperbarui. Dalam lingkungan yang banyak menulis dengan tabel besar, hal ini dapat menghabiskan banyak sumber daya sistem. Dalam lingkungan read-only atau read-mostly, hal ini tidak terlalu menjadi perhatian. Namun, Anda harus memastikan bahwa indeks tersebut benar-benar digunakan oleh aplikasi Anda, dan tidak hanya menghabiskan ruang.

Perbedaan antara database relasional (SQL) dan DynamoDB saat membuat indeks

Bandingkan CREATE INDEX pernyataan SQL dengan UpdateTable operasi di Amazon DynamoDB.

Membuat indeks dengan SQL

Dalam basis data relasional, indeks adalah struktur data yang memungkinkan Anda melakukan kueri cepat pada kolom yang berbeda dalam sebuah tabel. Anda dapat menggunakan CREATE INDEX SQL pernyataan untuk menambahkan indeks ke tabel yang ada, menentukan kolom yang akan diindeks. Setelah indeks dibuat, Anda dapat melakukan kueri data di tabel seperti biasa, tetapi sekarang basis data dapat menggunakan indeks untuk menemukan baris yang ditentukan dengan cepat di tabel alih-alih memindai keseluruhan tabel.

Setelah Anda membuat indeks, basis data mengelolanya untuk Anda. Setiap kali Anda memodifikasi data dalam tabel, indeks secara otomatis dimodifikasi untuk mencerminkan perubahan dalam tabel.

Di MySQL, Anda akan membuat indeks seperti berikut ini.

CREATE INDEX GenreAndPriceIndex ON Music (genre, price);

Membuat indeks di DynamoDB

Dalam DynamoDB, Anda dapat membuat dan menggunakan indeks sekunder untuk tujuan yang serupa.

Indeks di DynamoDB berbeda dari rekan-rekan relasional mereka. Ketika Anda membuat indeks sekunder, Anda harus menentukan atribut kunci—kunci partisi dan kunci urutan. Setelah membuat indeks sekunder, Anda dapat melakukan Query atau Scan padanya seperti yang Anda lakukan dengan tabel. DynamoDB tidak memiliki pengoptimal kueri, sehingga indeks sekunder hanya digunakan ketika Anda melakukan Query atau Scan padanya.

DynamoDB mendukung dua jenis indeks yang berbeda:

  • Indeks sekunder global - Kunci primer dari indeks dapat berupa setiap dua atribut dari tabel.

  • Indeks sekunder lokal - Kunci partisi indeks harus sama dengan kunci partisi dari tabel. Namun, kunci urutan dapat berupa atribut lainnya.

DynamoDB memastikan bahwa data dalam indeks sekunder akhirnya konsisten dengan tabel. Anda dapat meminta operasi Query atau Scan yang sangat konsisten pada tabel atau indeks sekunder lokal. Namun, indeks sekunder global hanya mendukung konsistensi akhir.

Anda dapat menambahkan indeks sekunder global ke tabel yang ada, menggunakan operasi UpdateTable dan menentukan 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 } } } ] }

Anda harus memberikan parameter berikut untuk UpdateTable:

  • TableName – Tabel yang akan dikaitkan dengan indeks.

  • AttributeDefinitions – Jenis data untuk atribut skema kunci dari indeks.

  • GlobalSecondaryIndexUpdates – Detail tentang indeks yang ingin Anda buat:

    • IndexName – Nama untuk indeks.

    • KeySchema – Atribut yang digunakan untuk kunci primer indeks.

    • Projection – Atribut dari tabel yang disalin ke indeks. Dalam kasus ini, ALL berarti bahwa semua atribut disalin.

    • ProvisionedThroughput (for provisioned tables) – Jumlah baca dan tulis per detik yang Anda butuhkan untuk tabel ini. (Ini terpisah dari pengaturan throughput yang ditetapkan pada tabel.)

Bagian dari operasi ini melibatkan pengisian data dari tabel ke indeks baru. Selama pengisian, tabel tetap tersedia. Namun, indeks tidak siap hingga atribut Backfilling miliknya berubah dari true ke false. Anda dapat menggunakan operasi DescribeTable untuk melihat atribut ini.

Perbedaan antara database relasional (SQL) dan DynamoDB saat menanyakan dan memindai indeks

Bandingkan kueri dan pemindaian indeks menggunakan SELECT pernyataan SQL dengan Query dan Scan operasi di Amazon DynamoDB.

Meminta dan memindai indeks dengan SQL

Dalam basis data relasional, Anda tidak bekerja secara langsung dengan indeks. Sebaliknya, Anda membuat kueri tabel dengan menerbitkan pernyataan SELECT, dan pengoptimal kueri dapat menggunakan setiap indeks.

Query optimizer adalah komponen sistem manajemen basis data relasional (RDBMS) yang mengevaluasi indeks yang tersedia dan menentukan apakah indeks tersebut dapat digunakan untuk mempercepat kueri. Jika indeks dapat digunakan untuk mempercepat kueri, RDBMS mengakses indeks terlebih dahulu dan kemudian menggunakannya untuk menemukan data dalam tabel.

Berikut adalah beberapa SQL pernyataan yang dapat digunakan GenreAndPriceIndexuntuk meningkatkan kinerja. Kami berasumsi bahwa tabel Music memiliki cukup data di dalamnya hingga pengoptimal kueri memutuskan untuk menggunakan indeks ini, alih-alih memindai seluruh tabel.

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

Mengkueri dan memindai indeks di DynamoDB

Dalam DynamoDB, Anda melakukan operasi Query dan Scan secara langsung pada indeks, dengan cara yang sama seperti yang Anda lakukan pada tabel. Anda dapat menggunakan API DynamoDB atau PartiQL SQL (bahasa kueri yang kompatibel) untuk menanyakan atau memindai indeks. Anda harus menentukan baik TableName dan IndexName.

Berikut ini adalah beberapa pertanyaan GenreAndPriceIndexdi DynamoDB. (Skema kunci untuk indeks ini terdiri dari Genre dan Price.)

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

Contoh ini menggunakan ProjectionExpression untuk menunjukkan bahwa Anda hanya ingin beberapa atribut, bukan semuanya, untuk muncul dalam hasil.

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

Berikut ini adalah pemindaian GenreAndPriceIndex.

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

Dengan PartiQL, Anda menggunakan pernyataan PartiQL Select untuk melakukan kueri dan pemindaian pada indeks.

// 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

Berikut ini adalah pemindaian GenreAndPriceIndex.

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

Untuk contoh kode menggunakan Select, lihat Pernyataan pemilihan PartiQL untuk DynamoDB.