- PostgreSQL 18 mendukung UUIDv7 secara bawaan, dan menyediakan pengenal unik yang dapat diurutkan serta ramah indeks
- UUIDv7 mempertahankan keunikan dan keamanan di lingkungan terdistribusi dari UUID yang ada, sambil mengadopsi struktur pengurutan berbasis waktu yang menguntungkan bagi indeks btree
- Dari kekurangan penggunaan UUID sebelumnya, yaitu tidak bisa diurutkan, indeks yang berantakan, dan ukuran memori, UUIDv7 menyelesaikan dua masalah pertama dan mewujudkan pengurutan berdasarkan waktu serta optimasi penyisipan
- Di PostgreSQL 18, UUID dapat dibuat dengan fungsi
uuidv7(), dan juga tersedia fitur ekstraksi timestamp serta input waktu kustom
- Kini alasan untuk ragu menggunakan UUID sebagai primary key telah teratasi, sehingga menjadi pilihan yang lebih cocok untuk sistem terdistribusi dan lingkungan multi-tenant
PostgreSQL 18
- Versi beta PostgreSQL 18 telah dirilis, dan pengujian sedang berlangsung dengan target rilis resmi pada bulan September
- Fitur utama:
- Async I/O: I/O asinkron berbasis
io_uring meningkatkan kecepatan sequence scan dan vacuum hingga 2~3 kali
- Skip scan pada indeks btree multi-kolom, optimasi kueri
OR/IN
- Mempertahankan statistik planner antar-upgrade
- Fungsi UUIDv7
- Kolom terhitung virtual, login OAuth, penambahan informasi I/O/CPU/WAL pada EXPLAIN, dan lain-lain
Kelebihan UUID
- Dapat membuat ID unik di lingkungan terdistribusi
- Keamanan diperkuat dengan pengenal publik yang tidak dapat diprediksi
- Dapat membuat ID langsung di klien sehingga meminimalkan komunikasi dengan server
Kekurangan UUID lama
- Tidak dapat diurutkan
- Penurunan performa penyisipan akibat ketidaklokalan indeks
- Overhead akibat ukuran 128-bit
Solusi dari UUIDv7
- Versi UUID baru yang diperkenalkan sesuai RFC 9562 (diumumkan pada Mei 2024)
- 48 bit pertama berisi timestamp berbasis Unix Epoch, sisanya menggabungkan nilai acak + penghitung
- Dapat diurutkan berdasarkan waktu, dan meningkatkan efisiensi penyisipan indeks
- UUIDv6 untuk kompatibilitas mundur, UUIDv8 untuk eksperimen/ekstensi vendor
- Hanya UUIDv7 yang secara praktis merupakan standar baru yang benar-benar bermakna
Penggunaan UUIDv7 di PostgreSQL 18
- Membuat UUID berbasis waktu saat ini dengan fungsi
uuidv7()
- Melalui
uuidv7(INTERVAL), offset waktu yang diinginkan dapat diterapkan
- Dengan fungsi
uuid_extract_version() dan uuid_extract_timestamp(), versi UUID serta waktu pembuatannya dapat diekstrak
- Contoh:
CREATE TABLE test (
id uuid DEFAULT uuidv7() PRIMARY KEY,
name text
);
INSERT INTO test (name) VALUES ('foo');
INSERT INTO test (name) VALUES ('bar');
INSERT INTO test (id, name) VALUES (uuidv7(INTERVAL '-1 hour'), 'oldest');
SELECT uuid_extract_timestamp(id), name FROM test ORDER BY id;
uuidv4() ditambahkan sebagai alias untuk gen_random_uuid()
Kesimpulan dan rekomendasi
- UUIDv7 cocok bagi pengguna yang sebelumnya mengalami masalah performa saat memakai UUID
- Sambil mempertahankan kelebihan UUID, ia juga memastikan kemampuan pengurutan dan performa indeks
- Sudah bisa diuji sekarang juga di PostgreSQL 18 beta
- Pilihan yang cocok untuk pembuatan ID di sistem terdistribusi, aplikasi multi-tenant, dan lingkungan serverless
> “UUIDv7 adalah penambahan fitur yang tenang namun kuat, yang membuat kita mempertimbangkan kembali penggunaan UUID sebagai primary key di Postgres”
4 komentar
Saya menggunakan Prisma + ULID sebagai gantinya. Jauh lebih pendek dan lebih bagus.
Saya sudah membuat dan menggunakan fungsi seperti
uuid_generate_v7(), jadi ini kabar yang menyenangkan.Oh!!
Oh...!