Episode ini membedah vindexes sebagai kunci routing di Vitess: konfigurasi vindex untuk keyspace, perbedaan global dan local vindex beserta trade-off-nya, serta desain skema untuk tabel sharded dan unsharded dengan VSchema.

Di episode 4 kalian sudah mengenal vindex hash sebagai pemetaan nilai ke shard. Episode 8 memperdalam: vindex punya banyak jenis dan peran yang berbeda, ada vindex global yang berbagi data lintas shard dan vindex local yang hanya milik satu shard. Pilihan vindex menentukan seberapa cepat query kalian, seberapa mudah resharding, dan seberapa konsisten routing-nya.
Roadmap episode 8: konsep vindex lebih dalam, perbandingan global dan local vindex, desain skema sharded vs unsharded, serta konfigurasi vindex dalam praktik. Ini episode desain — hasilnya terasa di seluruh umur sistem.
Vindex bukan indeks database biasa. Ia adalah fungsi yang menjawab satu pertanyaan: "nilai X ada di shard mana?" Tiga peran utama yang bisa dimainkan vindex:
hash termasuk uniq: satu user_id hanya ada di satu shard.tenant_id di mana satu tenant menyebar. Vindex unicode_loose_md5 sering dipakai untuk ini.{
"sharded": true,
"vindexes": {
"hash": { "type": "hash" },
"tenant_lookup": { "type": "consistent_lookup_unique" }
},
"tables": {
"users": {
"column_vindexes": [
{ "column": "user_id", "name": "hash" }
],
"columns": [
{ "name": "tenant_id", "vindex": "tenant_lookup" }
]
}
}
}Perhatikan kolom tenant_id juga diberi vindex — ini contoh vindex sekunder untuk mempercepat query berdasarkan tenant_id tanpa membuat scatter.
Local vindex hidup di dalam satu shard: datanya tidak dibagikan antar shard. Vindex hash adalah contohnya — fungsi murni yang dihitung dari nilai, tanpa menyimpan data. Local vindex sederhana, tanpa biaya penyimpanan tambahan, dan tanpa masalah konsistensi. Namun ia tidak bisa menjawab query berdasarkan kolom yang bukan kolom sharding key.
Global vindex adalah pemetaan yang bisa mengarahkan query dari nilai non-sharding-key ke shard yang tepat. Cara kerjanya: data pemetaan disimpan sebagai tabel lookup — bisa di shard sendiri (unsharded lookup keyspace) atau di dalam tabel dengan vindex lain. Saat aplikasi query WHERE tenant_id = 'X', VTGate melihat lookup vindex untuk menemukan shard dari nilai tenant_id itu, tanpa scatter.
{
"vindexes": {
"tenant_lookup": {
"type": "consistent_lookup_unique",
"params": {
"table": "tenant_lookup",
"from": "tenant_id",
"to": "user_id"
}
}
}
}Vindex consistent_lookup_unique memakai tabel tenant_lookup untuk memetakan tenant_id ke user_id, yang kemudian dirutekan lewat vindex hash utama. Ini menghubungkan dua dunia: query berdasarkan tenant_id bisa menemukan shard tanpa scatter.
Info
Aturan desain: mulai dari local vindex untuk kolom sharding key. Tambahkan global lookup vindex hanya untuk kolom yang benar-benar sering dipakai dalam query dengan filter. Setiap lookup vindex membawa biaya penyimpanan dan kompleksitas transaksi.
Tabel sharded menyimpan baris di shard berbeda berdasarkan vindex. Konsekuensinya penting: foreign key antar tabel berbeda shard tidak bisa dijamin secara konsisten, karena baris terkait bisa berada di MySQL berbeda. Vitess menangani ini dengan menonaktifkan FK enforcement lintas shard dan mendorong desain aplikasi untuk menjaga integritas.
Pola desain yang umum:
orders) di-shard dengan user_id, sama seperti users.users JOIN orders ON user_id bisa diselesaikan di satu shard.Tidak semua tabel harus di-shard. Tabel referensi yang kecil dan jarang berubah — kode negara, daftar produk kecil, konfigurasi — lebih baik unsharded: tersimpan di satu shard (atau di keyspace unsharded terpisah), dan query-nya selalu tepat satu lokasi tanpa scatter.
CREATE TABLE countries (
code char(2) primary key,
name varchar(100)
)Perintah CREATE TABLE countries di keyspace unsharded menyimpan tabel di satu lokasi. Vitess juga punya mekanisme reference tables yang menyalin tabel unsharded ke setiap shard keyspace sharded — supaya join dengan tabel sharded bisa berjalan tanpa keluar shard.
Urutan kerja yang biasa:
vtctlclient ApplyVschema -vschema_file=vschema.json users
vtctlclient GetVschema usersvtctlclient GetVschema menampilkan VSchema yang aktif — cara cepat memverifikasi bahwa konfigurasi sudah benar dan konsisten dengan niat kalian.
Warning
Mengubah vindex setelah data tersimpan tidak bisa dilakukan seenaknya: data yang sudah didistribusikan berdasarkan vindex lama harus dihitung ulang, biasanya lewat resharding. Desain vindex sejak awal lebih murah daripada memperbaiki belakangan.
Pada episode 8 ini kalian sudah memahami vindex secara mendalam: peran uniq, non-unique, dan lookup, perbedaan global dan local vindex beserta trade-off-nya, desain skema untuk tabel sharded dan unsharded, serta alur kerja konfigurasi vindex dengan VSchema.
Inti yang harus dibawa pulang:
Di episode 9 berikutnya kita urus jaminan: transaction dan consistency models — ACID di Vitess, transaksi single-shard vs cross-shard, dukungan XA, locking, dan praktik terbaik konsistensi. Sampai jumpa!