All Products
Search
Document Center

Tablestore:Gunakan indeks sekunder untuk membaca data

Last Updated:Sep 21, 2026

Jika tabel indeks berisi kolom atribut yang ingin Anda kembalikan, Anda dapat membaca langsung dari tabel indeks tersebut. Jika tidak, Anda perlu mengkueri data dari tabel data tempat tabel indeks tersebut dibuat.

Prasyarat

Sebelum memulai, pastikan Anda telah:

Catatan penggunaan

  • Tabel indeks hanya dapat digunakan untuk membaca data.

  • Kolom kunci primer pertama pada tabel indeks sekunder lokal harus sama dengan kolom kunci primer pertama pada tabel data.

  • Jika kolom atribut yang akan dikembalikan tidak termasuk dalam tabel indeks, Anda harus mengkueri tabel data untuk mengambil data tersebut.

Gunakan operasi GetRow untuk membaca satu baris dari tabel indeks. Untuk detail parameter, lihat Read a single row of data.

Parameter

Saat memanggil GetRow pada tabel indeks, atur parameter berikut:

Parameter

Deskripsi

TableName

Nama tabel indeks, bukan tabel data.

Kolom kunci primer

Sertakan baik kolom indeks maupun kolom kunci primer dari tabel data. Tablestore secara otomatis menambahkan kolom kunci primer tabel data yang tidak ditentukan sebagai kolom indeks ke dalam tabel indeks sebagai kolom kunci primer tambahan.

Contoh

Contoh berikut membaca satu baris dari tabel indeks dengan menentukan kunci primernya secara lengkap. Kunci primer terdiri dari kolom indeks definedcol1 diikuti oleh kolom kunci primer tabel data pk1 dan pk2.

func GetRowFromIndex(client *tablestore.TableStoreClient, indexName string) {
    getRowRequest := new(tablestore.GetRowRequest)
    criteria := new(tablestore.SingleRowQueryCriteria)
    // Construct the primary key.
    // For an LSI, the first primary key column must match the first primary key column of the data table.
    putPk := new(tablestore.PrimaryKey)
    putPk.AddPrimaryKeyColumn("definedcol1", "value1")
    putPk.AddPrimaryKeyColumn("pk1", int64(2))
    putPk.AddPrimaryKeyColumn("pk2", []byte("pk2"))
    criteria.PrimaryKey = putPk

    getRowRequest.SingleRowQueryCriteria = criteria
    getRowRequest.SingleRowQueryCriteria.TableName = indexName
    getRowRequest.SingleRowQueryCriteria.MaxVersion = 1
    getResp, err := client.GetRow(getRowRequest)
    if err != nil {
        fmt.Println("getrow failed with error:", err)
    } else {
        fmt.Println("get row", getResp.Columns[0].ColumnName, "result is", getResp.Columns[0].Value)
    }
}

TableName diatur ke nama tabel indeks. Kunci primer mengikuti urutan kolom tabel indeks: kolom indeks terlebih dahulu (definedcol1), lalu kolom kunci primer tabel data (pk1, pk2). MaxVersion = 1 hanya mengembalikan versi terbaru dari setiap kolom atribut.

Baca data dalam rentang kunci primer

Gunakan operasi GetRange untuk membaca baris-baris yang nilai kunci primernya berada dalam rentang tertentu. Untuk detail parameter, lihat Read a range of data.

Parameter

Saat memanggil GetRange pada tabel indeks, atur parameter berikut:

Parameter

Deskripsi

TableName

Nama tabel indeks, bukan tabel data.

Kunci primer awal dan akhir

Tentukan kunci primer lengkap untuk kedua ujung rentang. Sertakan semua kolom indeks dan kolom kunci primer tabel data. Rentang ini merupakan interval tertutup di kiri dan terbuka di kanan: [start, end).

Perbedaan urutan kunci primer antara GSI dan LSI

Urutan kolom kunci primer berbeda antara jenis indeks:

Jenis indeks

Urutan kolom kunci primer

Global secondary index (GSI)

Kolom indeks terlebih dahulu, lalu kolom kunci primer tabel data

Local secondary index (LSI)

Kolom kunci primer pertama tabel data terlebih dahulu, lalu kolom indeks, kemudian kolom kunci primer tabel data sisanya

Sebagai contoh, jika tabel data memiliki kolom kunci primer pk1 dan pk2, dan definedcol1 adalah kolom indeks:

  • Urutan kunci primer GSI: definedcol1 → pk1 → pk2

  • Urutan kunci primer LSI: pk1 → definedcol1 → pk2

Contoh

Gunakan global secondary index

Contoh berikut membaca baris-baris dari GSI di mana kolom indeks definedcol1 bernilai value1. Kunci primer awal dan akhir menggunakan AddPrimaryKeyColumnWithMinValue dan AddPrimaryKeyColumnWithMaxValue pada pk1 dan pk2 untuk mencakup semua baris yang sesuai dengan nilai kolom indeks tersebut.

func GetRangeFromGlobalIndex(client *tablestore.TableStoreClient, indexName string) {
    getRangeRequest := &tablestore.GetRangeRequest{}
    rangeRowQueryCriteria := &tablestore.RangeRowQueryCriteria{}
    rangeRowQueryCriteria.TableName = indexName

    // Construct the start primary key. The range is a left-closed, right-open interval.
    startPK := new(tablestore.PrimaryKey)
    // GSI primary key order: index column first, then data table primary key columns.
    startPK.AddPrimaryKeyColumn("definedcol1", "value1")
    startPK.AddPrimaryKeyColumnWithMinValue("pk1")
    startPK.AddPrimaryKeyColumnWithMinValue("pk2")

    endPK := new(tablestore.PrimaryKey)
    endPK.AddPrimaryKeyColumn("definedcol1", "value1")
    endPK.AddPrimaryKeyColumnWithMaxValue("pk1")
    endPK.AddPrimaryKeyColumnWithMaxValue("pk2")
    rangeRowQueryCriteria.StartPrimaryKey = startPK
    rangeRowQueryCriteria.EndPrimaryKey = endPK
    rangeRowQueryCriteria.Direction = tablestore.FORWARD
    rangeRowQueryCriteria.MaxVersion = 1
    rangeRowQueryCriteria.Limit = 10
    getRangeRequest.RangeRowQueryCriteria = rangeRowQueryCriteria

    getRangeResp, err := client.GetRange(getRangeRequest)

    fmt.Println("get range result is ", getRangeResp)

    for {
        if err != nil {
            fmt.Println("get range failed with error:", err)
        }
        if len(getRangeResp.Rows) > 0 {
            for _, row := range getRangeResp.Rows {
                fmt.Println("range get row with key", row.PrimaryKey.PrimaryKeys[0].Value, row.PrimaryKey.PrimaryKeys[1].Value, row.PrimaryKey.PrimaryKeys[2].Value)
            }
            if getRangeResp.NextStartPrimaryKey == nil {
                break
            } else {
                fmt.Println("next pk is :", getRangeResp.NextStartPrimaryKey.PrimaryKeys[0].Value, getRangeResp.NextStartPrimaryKey.PrimaryKeys[1].Value, getRangeResp.NextStartPrimaryKey.PrimaryKeys[2].Value)
                getRangeRequest.RangeRowQueryCriteria.StartPrimaryKey = getRangeResp.NextStartPrimaryKey
                getRangeResp, err = client.GetRange(getRangeRequest)
            }
        } else {
            break
        }

        fmt.Println("continue to query rows")
    }
    fmt.Println("getrow finished")
}

Poin-poin penting:

  • Kunci primer GSI dimulai dengan kolom indeks (definedcol1), diikuti oleh kolom kunci primer tabel data (pk1, pk2).

  • Mengatur definedcol1 ke nilai yang sama pada kunci awal dan akhir, dikombinasikan dengan nilai min/maks untuk pk1 dan pk2, mengambil semua baris di mana definedcol1 = "value1".

  • Jika NextStartPrimaryKey tidak nil, hasilnya dipaginasi. Perulangan dilanjutkan hingga semua baris yang sesuai dikembalikan.

Gunakan local secondary index

Contoh berikut membaca semua baris dari LSI. Berbeda dengan GSI, kunci primer LSI dimulai dengan kolom kunci primer pertama tabel data (pk1), diikuti oleh kolom indeks (definedcol1), lalu kolom kunci primer tabel data sisanya (pk2).

func GetRangeFromLocalIndex(client *tablestore.TableStoreClient, indexName string) {
    getRangeRequest := &tablestore.GetRangeRequest{}
    rangeRowQueryCriteria := &tablestore.RangeRowQueryCriteria{}
    rangeRowQueryCriteria.TableName = indexName

    // Construct the start primary key. The range is a left-closed, right-open interval.
    startPK := new(tablestore.PrimaryKey)
    // LSI primary key order: data table's first PK column, then index column, then remaining PK columns.
    startPK.AddPrimaryKeyColumnWithMinValue("pk1")
    startPK.AddPrimaryKeyColumnWithMinValue("definedcol1")
    startPK.AddPrimaryKeyColumnWithMinValue("pk2")

    // Construct the end primary key.
    endPK := new(tablestore.PrimaryKey)
    endPK.AddPrimaryKeyColumnWithMaxValue("pk1")
    endPK.AddPrimaryKeyColumnWithMaxValue("definedcol1")
    endPK.AddPrimaryKeyColumnWithMaxValue("pk2")
    rangeRowQueryCriteria.StartPrimaryKey = startPK
    rangeRowQueryCriteria.EndPrimaryKey = endPK
    rangeRowQueryCriteria.Direction = tablestore.FORWARD
    rangeRowQueryCriteria.MaxVersion = 1
    rangeRowQueryCriteria.Limit = 10
    getRangeRequest.RangeRowQueryCriteria = rangeRowQueryCriteria

    getRangeResp, err := client.GetRange(getRangeRequest)

    fmt.Println("get range result is ", getRangeResp)

    for {
        if err != nil {
            fmt.Println("get range failed with error:", err)
        }
        if len(getRangeResp.Rows) > 0 {
            for _, row := range getRangeResp.Rows {
                fmt.Println("range get row with key", row.PrimaryKey.PrimaryKeys[0].Value, row.PrimaryKey.PrimaryKeys[1].Value, row.PrimaryKey.PrimaryKeys[2].Value)
                // To return attribute columns stored in the index table, uncomment the following line.
                //fmt.Println("get row", row.Columns[0].ColumnName, "result is ", row.Columns[0].Value)
            }
            if getRangeResp.NextStartPrimaryKey == nil {
                break
            } else {
                fmt.Println("next pk is :", getRangeResp.NextStartPrimaryKey.PrimaryKeys[0].Value, getRangeResp.NextStartPrimaryKey.PrimaryKeys[1].Value, getRangeResp.NextStartPrimaryKey.PrimaryKeys[2].Value)
                getRangeRequest.RangeRowQueryCriteria.StartPrimaryKey = getRangeResp.NextStartPrimaryKey
                getRangeResp, err = client.GetRange(getRangeRequest)
            }
        } else {
            break
        }

        fmt.Println("continue to query rows")
    }
    fmt.Println("getrow finished")
}

Poin-poin penting:

  • Kunci primer LSI dimulai dengan pk1 (kolom kunci primer pertama tabel data), lalu definedcol1 (kolom indeks), lalu pk2. Urutan ini berbeda dari GSI, di mana kolom indeks muncul terlebih dahulu.

  • Menggunakan nilai min/maks untuk ketiga kolom tersebut melakukan pemindaian terhadap semua baris dalam LSI.

  • Untuk mengambil kolom atribut yang disimpan dalam tabel indeks, hapus komentar pada baris row.Columns di dalam badan perulangan.

FAQ

  • Untuk kueri multidimensi dan analisis data—seperti kueri pada kolom non-kunci primer, kueri Boolean, kueri fuzzy, agregasi, dan hasil berkelompok—buatlah search index dan kueri data melaluinya. Untuk informasi selengkapnya, lihat Search index.

  • Untuk mengkueri dan menganalisis data menggunakan pernyataan SQL, gunakan fitur SQL query. Untuk informasi selengkapnya, lihat SQL query.