Saya baru mengenal PostgreSQL dan agak baru di database secara umum. Apakah ada cara yang mapan tentang bagaimana kita harus mengindeks nilai-nilai UUID di Postgres? Saya terpecah antara menggunakan hashing dan menggunakan trie, kecuali sudah ada sesuatu bawaan yang digunakan secara otomatis. Apa pun yang saya gunakan akan menangani data dalam jumlah besar.
Indeks "text_ops" keluarga operator SP-GiST menggunakan trie. Karena UUID sangat panjang dan sangat berbeda, ini terdengar menarik meskipun saya hanya akan melakukan pencarian penuh.
Ada juga opsi hash. Hashing adalah O (1), dan saya tidak perlu melakukan perbandingan selain kesetaraan tentu saja, tetapi karena UUID cukup panjang, saya khawatir menghasilkan hash dari mereka akan menghabiskan banyak waktu.
Atau ini sesuatu yang terlalu tergantung pada sistem dan penggunaan spesifik?
Saya lebih suka menggunakan bigserial dalam banyak kasus, tetapi saya telah diberitahu untuk menggunakan uuid untuk ini. Kami membutuhkan uuid karena kami mungkin memiliki beberapa server menggunakan database yang berbeda, jadi tidak ada jaminan bahwa kami akan mendapatkan bigint yang unik. Kita dapat menggunakan urutan (dan seed) yang berbeda untuk setiap server, tetapi masih tidak sefleksibel UUID. Misalnya, kami tidak akan dapat memigrasi entri basis data dari satu server ke server lain tanpa mengonversi ID dan rujukan mereka di mana-mana.
sumber
Jawaban:
Gunakan
uuid
tipe data bawaan PostgreSQL , dan buat indeks b-tree reguler di atasnya.Tidak perlu melakukan sesuatu yang istimewa. Ini akan menghasilkan indeks yang optimal, dan juga akan menyimpan
uuid
bidang dalam bentuk yang ringkas seperti saat ini praktis.(Indeks hash di PostgreSQL sebelum versi 10 tidak crash-safe dan benar-benar peninggalan sejarah yang cenderung berkinerja tidak lebih baik daripada b-tree. Hindari mereka. Pada PostgreSQL 10 mereka telah dibuat crash-safe dan memiliki beberapa peningkatan kinerja dibuat sehingga Anda mungkin ingin mempertimbangkannya.)
Jika karena alasan tertentu Anda tidak bisa menggunakan
uuid
tipe, Anda biasanya akan membuat b-tree pada representasi teks atau, lebih disukai,bytea
representasi dari uuid.sumber
hash
indeks versusb-tree
adalah kepercayaan yang umum dipegang, saya pikir akan sangat membantu untuk mengutip sumber untuk klaim seperti itu.hash
indeks sekarang aman untuk crash. Yang mengatakan,hash
indeks hanya dapat digunakan dengan=
, jadi jika Anda memerlukan operator lain,b-tree
masih lebih disukai.hash
belum jauh lebih cepat daripadab-tree
, bahkan di Postgres 10. Tetapi karena indeks hash mengambil ruang disk jauh lebih sedikit daripada b-tree, mungkin lebih cepat dalam pengaturan di mana indeks besar menjadi sebuah masalah, yang saya rasa belum terjadi bagi saya. Yah saya akan mengawasi sekarang bahwa saya benar-benar dapat menggunakannya dengan aman di v10.Indeks hash hilang dalam aksi di PostgreSQL. PostgreSQL tahu perlu indeks hash, dan bahwa kode untuk indeks hash sudah tua dan berjamur, tetapi mereka tidak menghapusnya karena mereka sedang menunggu seseorang untuk datang dan memeriksa pengindeksan hash. Lihat utas ini:
http://www.postgresql.org/message-id/[email protected]
sumber