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:
Memiliki instans OTSClient yang telah diinisialisasi. Untuk informasi selengkapnya, lihat Initialize a Tablestore client.
Membuat indeks sekunder. Untuk informasi selengkapnya, lihat Create a secondary index.
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 |
| 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 |
| 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: |
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→pk2Urutan 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
definedcol1ke nilai yang sama pada kunci awal dan akhir, dikombinasikan dengan nilai min/maks untukpk1danpk2, mengambil semua baris di manadefinedcol1 = "value1".Jika
NextStartPrimaryKeytidaknil, 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), laludefinedcol1(kolom indeks), lalupk2. 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.Columnsdi 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.