Indeks Sekunder Global dan Indeks Sekunder Lokal
Tambahkan GSI dan LSI untuk mendukung pola kueri alternatif tanpa menggandakan tabel.
Indeks Sekunder Global dan Indeks Sekunder Lokal adalah pelajaran Cloud & IT Cert Prep gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Cloud & IT Cert Prep, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Cloud & IT Cert Prep mencakup 4 pelajaran total.
Alasan Indeks Sekunder Ada
Kunci primer DynamoDB menentukan satu-satunya jalur kueri yang efisien pada sebuah tabel. Jika Anda perlu melakukan kueri item berdasarkan atribut lain—misalnya, ingin menemukan semua pesanan untuk ID produk ketika kunci partisi tabel adalah CustomerId—Anda harus melakukan Scan yang mahal tanpa indeks sekunder.
Indeks sekunder mengatasi hal ini dengan mempertahankan salinan data terpisah yang diperbarui secara otomatis dan disusun berdasarkan kunci yang berbeda. DynamoDB menawarkan dua jenis: Global Secondary Index (GSI) dan Local Secondary Index (LSI), masing-masing dengan kompromi yang berbeda.
Dasar-Dasar Global Secondary Index (GSI)
Global Secondary Index memungkinkan Anda menentukan kunci partisi yang sepenuhnya berbeda (dan, secara opsional, kunci pengurutan) dari tabel dasar. GSI benar-benar bersifat global—indeks ini mencakup semua partisi tabel dasar. Anda dapat melakukan kueri pada GSI untuk menemukan item berdasarkan atribut apa pun yang Anda tetapkan sebagai kunci partisi GSI.
GSI memiliki throughput yang disediakan sendiri (atau mewarisi mode sesuai permintaan) secara independen dari tabel dasar. Anda dapat membuat hingga 20 GSI per tabel dan dapat menambahkan atau menghapus GSI kapan saja pada tabel yang sudah ada.
# Create a table with a GSI on ProductId
aws dynamodb create-table \
--table-name Orders \
--attribute-definitions \
AttributeName=OrderId,AttributeType=S \
AttributeName=ProductId,AttributeType=S \
AttributeName=OrderDate,AttributeType=S \
--key-schema AttributeName=OrderId,KeyType=HASH \
--global-secondary-indexes '[
{
"IndexName": "ProductId-OrderDate-index",
"KeySchema": [
{"AttributeName": "ProductId", "KeyType": "HASH"},
{"AttributeName": "OrderDate", "KeyType": "RANGE"}
],
"Projection": {"ProjectionType": "ALL"},
"ProvisionedThroughput": {"ReadCapacityUnits": 10, "WriteCapacityUnits": 5}
}
]' \
--provisioned-throughput ReadCapacityUnits=10,WriteCapacityUnits=5Dasar-Dasar Local Secondary Index (LSI)
Local Secondary Index menggunakan kunci partisi yang sama dengan tabel dasar, tetapi menggunakan kunci pengurutan yang berbeda. LSI disebut 'lokal' karena indeks ini hanya melakukan kueri dalam satu partisi (item dengan kunci partisi yang sama). Hal ini menjadikan LSI ideal untuk melakukan kueri pesanan pelanggan tertentu yang diurutkan berdasarkan atribut berbeda.
LSI harus ditentukan saat pembuatan tabel—Anda tidak dapat menambahkan atau menghapusnya nanti. Setiap tabel dapat memiliki hingga 5 LSI. LSI berbagi kapasitas yang disediakan tabel dasar (tanpa throughput terpisah) dan tunduk pada batas penyimpanan 10 GB per kunci partisi untuk gabungan data tabel dasar dan LSI.
# Create a table with an LSI (at creation time only)
aws dynamodb create-table \
--table-name Orders \
--attribute-definitions \
AttributeName=CustomerId,AttributeType=S \
AttributeName=OrderDate,AttributeType=S \
AttributeName=TotalAmount,AttributeType=N \
--key-schema \
AttributeName=CustomerId,KeyType=HASH \
AttributeName=OrderDate,KeyType=RANGE \
--local-secondary-indexes '[{
"IndexName": "TotalAmount-index",
"KeySchema": [
{"AttributeName": "CustomerId", "KeyType": "HASH"},
{"AttributeName": "TotalAmount", "KeyType": "RANGE"}
],
"Projection": {"ProjectionType": "ALL"}
}]' \
--billing-mode PAY_PER_REQUESTPerbedaan Utama GSI dan LSI
Berikut perbandingan berdampingan untuk memperjelas materi ujian:
- Kunci partisi: GSI dapat berbeda dari tabel dasar; LSI harus sama dengan tabel dasar
- Kunci pengurutan: keduanya mendukung kunci pengurutan yang berbeda dari tabel dasar
- Saat dibuat: GSI dapat dibuat kapan saja; LSI hanya saat tabel dibuat
- Kapasitas throughput: GSI memiliki kapasitas sendiri; LSI berbagi kapasitas throughput tabel dasar
- Konsistensi: pembacaan GSI hanya bersifat konsisten akhirnya; pembacaan LSI dapat bersifat konsisten kuat
- Batas: hingga 20 GSI; hingga 5 LSI per tabel
Jenis Proyeksi
Saat membuat indeks, Anda memilih atribut mana yang akan diproyeksikan (disalin) ke dalamnya:
- HANYA_KUNCI: hanya kunci utama tabel dasar dan kunci indeks—indeks paling kecil, tetapi memerlukan panggilan GetItem tambahan untuk atribut nonkunci
- INCLUDE: atribut kunci ditambah daftar atribut tambahan tertentu yang Anda tentukan—menyeimbangkan ukuran dan pola akses
- ALL: semua atribut diproyeksikan ke dalam indeks—paling fleksibel, tetapi membutuhkan penyimpanan dan biaya penulisan lebih besar
Pilih jenis proyeksi berdasarkan atribut yang benar-benar diperlukan oleh kueri Anda. Proyeksi berlebihan membuang WCU pada setiap penulisan; proyeksi yang terlalu sedikit memaksa Anda melakukan panggilan GetItem tambahan untuk mengambil atribut yang tidak ada dalam indeks.
Melakukan Kueri pada GSI
Melakukan kueri pada GSI menggunakan API Query yang sama, tetapi menentukan parameter --index-name. Kueri dijalankan berdasarkan skema kunci GSI, bukan skema kunci tabel dasar. Kueri GSI selalu konsisten akhirnya—GSI diperbarui secara asinkron setelah penulisan ke tabel dasar, sehingga terdapat jeda singkat.
Jika suatu item dalam tabel dasar tidak memiliki atribut kunci partisi GSI, item tersebut sama sekali tidak disertakan dalam GSI (pola indeks renggang). Ini merupakan teknik yang ampuh untuk mengindeks hanya sebagian item, misalnya semua pesanan dengan status PENDING jika kunci partisi GSI adalah Status.
# Query the GSI for all orders for a product in 2026
aws dynamodb query \
--table-name Orders \
--index-name ProductId-OrderDate-index \
--key-condition-expression 'ProductId = :pid AND OrderDate BETWEEN :start AND :end' \
--expression-attribute-values \
'{":pid":{"S":"prod-abc"},":start":{"S":"2026-01-01"},":end":{"S":"2026-12-31"}}'Pola Indeks Renggang
Indeks renggang memanfaatkan fakta bahwa DynamoDB hanya memproyeksikan item ke GSI jika item tersebut memiliki nilai untuk kunci partisi GSI. Dengan menentukan kunci partisi GSI pada atribut yang hanya dimiliki sebagian item, Anda membuat indeks yang hanya berisi bagian tersebut.
Contoh: dalam tabel Orders, hanya pesanan yang belum dikirim yang memiliki atribut PendingShipmentDate. GSI pada PendingShipmentDate secara alami hanya berisi pesanan yang belum dikirim, sehingga menjadi cara yang sangat efisien untuk melakukan kueri terhadap semua pesanan yang masih tertunda tanpa memindai seluruh tabel.
Sharding Penulisan dengan Pembebanan Berlebih GSI
Pembebanan berlebih GSI adalah teknik desain satu tabel tingkat lanjut. Dalam teknik ini, berbagai jenis entitas disimpan dalam satu tabel dan menggunakan atribut kunci GSI generik (misalnya, GSI1PK dan GSI1SK) yang diisi dengan pola berbeda sesuai jenis item. Dengan demikian, setiap jenis entitas memiliki jalur kueri efisiennya sendiri melalui satu GSI.
Contoh: untuk item User, tetapkan GSI1PK = 'COUNTRY#US' dan GSI1SK = username; untuk item Order, tetapkan GSI1PK = 'STATUS#PENDING' dan GSI1SK = orderDate. Dengan melakukan kueri pada GSI menggunakan prefiks yang sesuai, Anda dapat mengambil jenis entitas yang dituju secara efisien.
Pembatasan dan Kapasitas Indeks
Pembatasan GSI terjadi secara terpisah dari tabel dasar. Jika WCU yang disediakan untuk GSI terlalu rendah, penulisan pada item yang diproyeksikan ke GSI akan dibatasi—bahkan jika tabel dasar memiliki kapasitas yang cukup. Pantau ConsumedWriteCapacityUnits dan ThrottledRequests untuk setiap GSI secara terpisah.
Kesalahan umum adalah menyediakan kapasitas GSI yang lebih rendah daripada tabel dasar, lalu mengalami pembatasan ketika pola penulisan tiba-tiba meningkatkan laju penulisan ke GSI. Gunakan penskalaan otomatis pada GSI atau pilih mode Sesuai Permintaan untuk menghindari hal ini.
Kapan Menggunakan GSI, LSI, atau Mendesain Ulang
Panduan pengambilan keputusan untuk ujian SAA-C03:
- Perlu melakukan kueri berdasarkan atribut yang sepenuhnya berbeda → GSI
- Perlu melakukan kueri dalam partisi yang sama dengan pengurutan berbeda, dan sudah mengetahuinya saat pembuatan → LSI
- Perlu pembacaan yang konsisten kuat pada kunci pengurutan alternatif → LSI (satu-satunya pilihan, karena GSI bersifat konsisten akhirnya)
- Memiliki sepuluh atau lebih pola kueri yang berbeda → pertimbangkan desain satu tabel dengan pembebanan berlebih GSI, bukan banyak tabel terpisah
- Hanya perlu mengambil semua item untuk analisis → pertimbangkan kembali apakah DynamoDB merupakan basis data yang tepat
Menghapus dan Mengisi Ulang GSI
Anda dapat menghapus GSI kapan saja tanpa memengaruhi tabel dasar. Saat menambahkan GSI baru ke tabel yang sudah ada, DynamoDB mengisi ulang indeks secara asinkron dengan memindai tabel dasar—proses ini dapat memerlukan waktu beberapa menit hingga beberapa jam untuk tabel besar. Selama pengisian ulang, tabel dasar tetap sepenuhnya tersedia untuk pembacaan dan penulisan.
Anda dapat memantau kemajuan pengisian ulang di konsol atau melalui API DescribeTable dengan memeriksa bidang IndexStatus milik indeks—nilainya adalah CREATING selama pengisian ulang dan ACTIVE setelah selesai. Jangan melakukan kueri pada GSI sampai statusnya ACTIVE.
# Check GSI status during backfill
aws dynamodb describe-table \
--table-name Orders \
--query 'Table.GlobalSecondaryIndexes[*].{Name:IndexName,Status:IndexStatus}'Pemeriksaan Cepat
Uji pemahaman Anda tentang konsep AWS Solutions Architect (SAA-C03) dari pelajaran ini.
Rangkuman Pelajaran
Dalam pelajaran ini Anda mempelajari bahwa: GSI menyediakan kunci partisi alternatif dan dapat ditambahkan kapan saja, LSI berbagi kunci partisi dasar dan harus ditentukan saat pembuatan, serta jenis proyeksi mengatur atribut mana yang disalin ke indeks. GSI mendukung pola indeks renggang dan pembebanan berlebih untuk fleksibilitas kueri tingkat lanjut. Selanjutnya, kita akan membahas DynamoDB Stream dan Global Tables.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Indeks Sekunder Global dan Indeks Sekunder Lokal” gratis?
Ya — teks lengkap “Indeks Sekunder Global dan Indeks Sekunder Lokal” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Cloud & IT Cert Prep, upgrade ke CoddyKit PRO. Kursus Cloud & IT Cert Prep mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Indeks Sekunder Global dan Indeks Sekunder Lokal”?
Tambahkan GSI dan LSI untuk mendukung pola kueri alternatif tanpa menggandakan tabel. Kamu berlatih Cloud & IT Cert Prep dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Cloud & IT Cert Prep?
Tidak diperlukan pengalaman sebelumnya. Cloud & IT Cert Prep di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Indeks Sekunder Global dan Indeks Sekunder Lokal” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Cloud & IT Cert Prep ini?
Ya. Setiap pelajaran Cloud & IT Cert Prep menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Tabel, Item, dan Kunci Utama
- Kapasitas Terprovisi vs Sesuai Permintaan
- Indeks Sekunder Global dan Indeks Sekunder Lokal
- Aliran DynamoDB dan Tabel Global