Bagaimana saya harus mengindeks UUID di Postgres?

26

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.

sudo
sumber
2
Saya percaya "basis data gabungan" adalah kata kunci untuk situasi Anda. Dan, ya, UUID adalah solusi untuk itu. Itulah alasan mengapa UUID diciptakan beberapa dekade yang lalu: untuk berbagi data di antara sistem terdistribusi tanpa koordinasi terpusat.
Basil Bourque
Beberapa bulan kemudian: Memang, "basis data federasi" yang dibawa Basil Bourque adalah tujuan kami. Kami tidak hanya memiliki beberapa server, tetapi kami memiliki klien (yang dapat dianggap sebagai lebih banyak bagian dari DB gabungan) yang membuat ID saat offline juga. Itu sebabnya kami menggunakan UUID.
sudo

Jawaban:

31

Gunakan uuidtipe 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 uuidbidang 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 uuidtipe, Anda biasanya akan membuat b-tree pada representasi teks atau, lebih disukai, bytearepresentasi dari uuid.

Craig Ringer
sumber
2
Sementara pernyataan tentang hashindeks versus b-treeadalah kepercayaan yang umum dipegang, saya pikir akan sangat membantu untuk mengutip sumber untuk klaim seperti itu.
Volte
1
Pada PostgreSQL 10, hashindeks sekarang aman untuk crash. Yang mengatakan, hashindeks hanya dapat digunakan dengan =, jadi jika Anda memerlukan operator lain, b-treemasih lebih disukai.
rintaun
1
Beberapa tahun kemudian, dalam pengalaman saya, hashbelum jauh lebih cepat daripada b-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.
sudo
Ada beberapa tulisan yang bagus tentang peningkatan indeks hash di v10 dan v11: rhaas.blogspot.com/2017/09/… - amitkapila16.blogspot.com/2017/03/…
Glenn Morton
3

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]

derekm
sumber
Ya, saya mendapat peringatan ketika saya mencoba menggunakan indeks hash. "Sangat berkecil hati" atau sesuatu.
sudo
Indeks hash bekerja dengan baik di PostgreSQL dalam beberapa keadaan, tetapi saya baru-baru ini menemukan mereka menyebabkan pertanyaan saya tidak membuahkan hasil ketika saya mencoba mengoptimalkan dengan indeks hash pada built-in UUID tipe data kunci utama & kunci asing. Benar-benar ada manfaat untuk indeks hash, jika saja mereka bekerja untuk semua tipe data, dan para pengembang PostgreSQL tahu ini, mereka terlalu malas untuk memperbaikinya sendiri, dan mereka menjaga kode mereka seolah-olah mereka berdoa ke / untuk akhirnya penyelamat.
derekm
2
Seseorang telah menyelamatkan indeks hash, saya kira karena mereka memainkan peran penting dalam partisi data, yang Pg10 telah fokus pada: wiki.postgresql.org/wiki/… Tapi mereka masih tidak memberikan semua yang saya lihat secara teoritis berguna di kelas basis data perguruan tinggi;)
sudo