MySQL UUIDv7 Primary Key: Cara Implementasi & Performa

Penggunaan UUIDv7 sebagai primary key di MySQL menawarkan solusi terbaik untuk menggabungkan keunikan global dari UUID standar dengan performa pengurutan berbasis waktu (time-sorted). Berbeda dengan UUIDv4 yang sepenuhnya acak dan menyebabkan fragmentasi indeks B-Tree yang parah, UUIDv7 menyematkan timestamp Unix 48-bit pada bit-bit awal, sehingga nilai yang dihasilkan bersifat monotonik menaik mirip Auto Increment Integer.

Mulai MySQL 8.0, fungsi bawaan untuk menghasilkan UUIDv7 belum tersedia secara langsung, namun Anda dapat membuatnya menggunakan fungsi biner atau kolom terhitung (generated column), atau menunggu dukungan native pada versi MySQL terbaru. Pendekatan paling efisien untuk performa penyimpanan adalah menyimpan UUIDv7 dalam tipe data BINARY(16) untuk menghemat memori dan mempercepat operasi JOIN.

Perbandingan UUIDv7, UUIDv4, dan INT Auto Increment

Sebelum mengimplementasikannya pada tabel produksi, berikut adalah matriks perbandingan performa dan karakteristik penyimpanan antara UUIDv7, UUIDv4, dan Integer Auto Increment:

Karakteristik UUIDv7 UUIDv4 INT Auto Increment
Ukuran Penyimpanan 16 Byte (Binary) / 36 Char 16 Byte (Binary) / 36 Char 4-8 Byte
Pengurutan Waktu (Sortable) Ya (Monotonik Naik) Tidak (Acak) Ya
Fragmentasi Indeks B-Tree Sangat Rendah Sangat Tinggi Sangat Rendah
Keamanan Distribusi Global Unik (Tanpa Koordinasi) Global Unik (Tanpa Koordinasi) Rentan Enumerasi ID

Implementasi Tabel dengan BINARY(16)

Penyimpanan UUID dalam bentuk string teks (VARCHAR(36)) menghabiskan ruang memori yang besar dan menurunkan performa indeks. Cara terbaik adalah menyimpannya sebagai tipe data BINARY(16). Berikut adalah contoh pembuatan tabel dan fungsi konversi di MySQL:

CREATE TABLE users (
    id BINARY(16) NOT NULL,
    username VARCHAR(50) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (id),
    INDEX idx_created (created_at)
) ENGINE=InnoDB;

Menyisipkan dan Membaca UUIDv7 di MySQL

Karena aplikasi backend (seperti Node.js, PHP, Python, atau Go) umumnya men-generate UUIDv7 sebelum dikirim ke database, Anda dapat mengubah string UUIDv7 standar menjadi format biner menggunakan fungsi UUID_TO_BIN() dan membacanya kembali dengan BIN_TO_UUID().

-- Menyisipkan data UUIDv7 (format hex/string dikonversi ke binary)
INSERT INTO users (id, username)
VALUES (UUID_TO_BIN('01931320-74bc-7efa-8e4a-9b5f3d2a1c0e'), 'johndoe');

-- Membaca data dan mengembalikan ke format string UUID
SELECT BIN_TO_UUID(id) AS id, username, created_at 
FROM users;

Tips Troubleshooting & Performa Lapangan

  • Gunakan UUID_TO_BIN dengan Flag Swap: Saat menggunakan versi MySQL lama, pastikan fungsi biner menggunakan opsi urutan waktu (flag 1 pada UUID_TO_BIN(id, 1)) jika Anda menggunakan UUIDv1, namun untuk UUIDv7 struktur bit sudah diatur kronologis sehingga konversi standar byte-to-byte sudah mempertahankan urutan.
  • Cek Ukuran Buffer Pool: Indeks primer berbasis BINARY(16) jauh lebih padat dibandingkan VARCHAR(36), memastikan lebih banyak indeks yang dapat dimuat ke dalam InnoDB Buffer Pool.
  • Generate di Sisi Aplikasi: Sangat disarankan melakukan generasi UUIDv7 di sisi aplikasi (menggunakan pustaka bahasa pemrograman terkait) untuk mengurangi beban CPU pada server database MySQL.