全部产品
Search
文档中心

Lindorm:Merancang kunci primer untuk tabel lebar Lindorm

更新时间:Jul 02, 2025

LindormTable adalah mesin data terdistribusi yang mendistribusikan data berdasarkan kunci primer. Jika kunci primer sebuah tabel mencakup beberapa kolom, LindormTable menggunakan urutan kolom dari kiri ke kanan untuk menanyakan data. Kunci primer yang dirancang secara tidak tepat dapat menyebabkan query tidak efisien dan memengaruhi performa. Oleh karena itu, desain kunci primer sangat penting dalam partisi data dan query di Lindorm. Topik ini menjelaskan pertimbangan desain kunci primer serta memberikan contoh.

Pertimbangan

Apakah nilai kunci primer unik?

Versi berbeda dari baris menggunakan nilai kunci primer yang sama. Secara default, versi terbaru dikembalikan saat query dilakukan. Dalam kebanyakan kasus, kunci primer harus unik kecuali jika multi-versi diterapkan.

Praktik terbaik: Kunci primer adalah satu kolom atau kombinasi beberapa kolom. Setiap nilai kunci primer sesuai dengan satu catatan.

  • [userid]: Hanya satu kolom ditentukan sebagai kunci primer. Hanya satu catatan yang dihasilkan untuk setiap pengguna.

  • [userid][orderid]: Dua kolom ditentukan sebagai kunci primer. Beberapa catatan dihasilkan untuk setiap pengguna.

Bagaimana cara merancang kunci primer dalam skenario yang berbeda?

Desain kunci primer membatasi metode query yang dapat digunakan. Lindorm mendukung pernyataan SELECT dengan metode berikut:

  • Metode GET: Kunci primer digunakan untuk menanyakan data. Contoh: SELECT * FROM table WHERE userid='abc' AND orderid=123.

    Catatan

    Untuk menggunakan metode GET, Anda harus menentukan semua kolom kunci primer. Nilai di semua kolom kunci primer harus eksplisit.

  • Metode SCAN: Data ditanyakan berdasarkan rentang kunci primer. Contoh: SELECT * FROM table WHERE userid='abc' AND 123<orderid<456.

    Catatan

    Untuk menggunakan metode SCAN, Anda harus menentukan rentang yang ingin dipindai di kolom kunci primer pertama. Secara default, jika Anda tidak menentukan rentang, Lindorm menolak query yang memerlukan pemindaian penuh karena tidak efisien. Untuk informasi lebih lanjut, lihat SELECT.

Praktik terbaik: Bagaimana cara mengirimkan query kompleks menggunakan metode query sebelumnya?

  • Buat tabel indeks.

  • Tentukan kolom yang ingin dipindai selain kolom kunci primer dalam kondisi query. Lindorm secara otomatis menyaring data yang tidak relevan.

  • Gunakan indeks sekunder.

  • Gunakan ORDER BY untuk mengurutkan data secara menurun. Dengan cara ini, catatan baru diurutkan ke baris atas tabel. Contoh: SELECT * FROM table WHERE userid='abc' AND 123<orderid<456 ORDER BY orderid DESC.

    Catatan

    Dalam skenario di mana sebagian besar query bertujuan untuk mengambil data terkini, Anda dapat merancang kunci primer sebagai [userid][orderid DESC] untuk mengurutkan data secara menurun.

Faktor apa yang harus saya pertimbangkan saat merancang kunci primer?

Saat merancang kunci primer, Anda harus mempertimbangkan panjang nilai dalam kolom kunci primer dan jumlah kolom kunci primer.

  • Panjang nilai dalam kolom kunci primer: Nilai dalam kolom kunci primer harus pendek. Kami merekomendasikan Anda memilih kolom yang menyimpan nilai panjang tetap, seperti bilangan bulat panjang, sebagai kolom kunci primer. Jika panjang nilai dalam kolom kunci primer tidak tetap, kami merekomendasikan Anda membatasi panjang nilai hingga 2 KB untuk mengurangi biaya penyimpanan dan meningkatkan kinerja penulisan.

  • Jumlah kolom kunci primer: Kolom kunci primer yang lebih sedikit dapat meningkatkan kinerja penulisan dan mengurangi biaya penyimpanan. Kami merekomendasikan Anda membatasi jumlah kolom kunci primer antara 1 hingga 3.

Apa yang harus saya hindari saat merancang kunci primer?

Data yang disimpan di Lindorm didistribusikan berdasarkan kunci primer. Jika kunci primer sebuah tabel mencakup beberapa kolom, data didistribusikan berdasarkan kolom-kolom tersebut dalam urutan dari kiri ke kanan. Untuk menghindari operasi tulis yang berlebih pada sejumlah kecil data titik panas, perhatikan hal berikut saat menentukan kunci primer sebuah tabel:

  • Nilai di kolom kunci primer pertama harus tersebar.

  • Jangan tentukan kolom yang berisi data auto-incremental atau kolom di mana nilai memiliki awalan yang sama, seperti kolom timestamp, sebagai kolom kunci primer pertama atau kolom indeks.

  • Jangan tentukan kolom yang berisi data enumerasi, seperti jenis pesanan, atau kolom di mana nilai memiliki awalan yang jelas sebagai kolom kunci primer pertama.

Jika Anda harus menentukan kolom tipe sebelumnya sebagai kolom kunci primer pertama, gunakan metode hash untuk mendistribusikan data di kolom tersebut.

Sebagai contoh, jika Anda harus menentukan kolom pk yang berisi string auto-incremental sebagai kolom kunci primer pertama, Anda dapat membuat kolom baru bernama pk1 berdasarkan kolom pk dengan menggunakan algoritma berikut: pk1 = hash(pk).substring(0,4)+pk. Kolom pk1 digabungkan oleh kolom pk dan awalan yang merupakan empat digit pertama dari hasil yang dikembalikan oleh metode hash berdasarkan kolom pk.

Apakah titik panas bertumpuk terjadi untuk data yang sepenuhnya didistribusikan?

Metode hash digunakan untuk mendistribusikan data ke partisi yang berbeda. Ini mencegah server dari dihentikan oleh titik panas dan server lainnya menjadi idle. Dengan cara ini, arsitektur terdistribusi dan pemrosesan konkuren digunakan secara efisien.

Praktik terbaik:

  • Rancang algoritma hash MD5. Kunci primer adalah [md5(userid).subStr(0,4)][userId][orderid].

  • Rancang indeks terbalik. Kunci primer adalah [reverse(userid)][orderid].

  • Rancang operasi modulo. Kunci primer adalah [bucket][timestamp][hostname][log-event]; long bucket = timestamp % numBuckets.

  • Tambahkan angka acak. Kunci primer adalah [userId][orderid][random(100)].

Bisakah kunci primer disederhanakan?

Anda dapat mengurangi jumlah kolom kunci primer untuk mengurangi jumlah data yang dipindai dan meningkatkan efisiensi query serta operasi insert.

Praktik terbaik:

  • Ganti tipe data STRING dengan tipe data LONG atau INT. Contoh: '2015122410' => Long(2015122410).

  • Ganti nama dengan kode. Contoh: 'taobao'=> 'tb'.

Desain yang umum digunakan

  • Desain kunci primer untuk data log dan data deret waktu.

    • Menanyakan data dari laju yang dihasilkan selama periode tertentu. Kunci primer dirancang sebagai [hostname][log-event][timestamp].

    • Menanyakan catatan terbaru dari laju. Kunci primer dirancang sebagai [hostname][log-event][timestamp DESC].

    • Menanyakan data yang hanya berisi dimensi waktu atau menanyakan data yang volumenya besar dalam dimensi tertentu. Rancang kunci primer sebagai long bucket = timestamp % numBuckets; [bucket][timestamp][hostname][log-event].

  • Desain kunci primer untuk data transaksi.

    • Menanyakan catatan transaksi penjual dalam periode waktu tertentu. Rancang kunci primer sebagai [seller_id][timestmap][order_number].

    • Menanyakan catatan transaksi pembeli dalam periode waktu tertentu. Rancang kunci primer sebagai [buyer_id][timestmap][order_number].

    • Menanyakan data berdasarkan ID pesanan. Rancang kunci primer sebagai [order_number].

    • Gabungkan ketiga tabel untuk melakukan query. Kunci primer tabel yang menyimpan data pembeli dirancang sebagai [buyer_id][timestmap][order_number]. Kunci primer tabel yang menyimpan data penjual dirancang sebagai [seller_id][timestmap][order_number]. Kunci primer tabel yang menyimpan ID pesanan dirancang sebagai [order_number].