UUID v4 ve v7’ye Genel Bakış
Hem UUID v4 hem de v7, 8-4-4-4-12 formatında gruplanmış 32 onaltılık karakter olarak biçimlendirilmiş 128 bitlik tanımlayıcılardır. Fark, bu bitlerin içerdiği verilerdedir.
UUID v4 şuna benzer:
f47ac10b-58cc-4372-a567-0e02b2c3d479
^^^^
sürüm nibble = 4
UUID v7 şuna benzer:
018e2b3c-d4a1-7f2e-b8c9-1234567890ab
^^^^^^^^^^^^^
48-bit ms Unix zamanı
^
sürüm nibble = 7
Bu yapısal farkın veritabanları için gerçek performans etkileri vardır.
UUID v4: Yapısı
UUID v4, 122 biti rastgeleliğe ayırır. Kalan 6 bit ayrılmıştır:
- 4 bit sürümü kodlar (0100 = 4)
- 2 bit varyantı kodlar (RFC 4122 için 10)
xxxxxxxx-xxxx-4xxx-[89ab]xxx-xxxxxxxxxxxx
UUID v7: Yapısı
UUID v7, RFC 9562 (Mayıs 2024) ile standartlaştırılmıştır. İlk 48 biti Unix milisaniye zamanı, ardından sürüm bitleri ve rastgele veri gelir:
[48-bit ms Unix zamanı][4-bit sürüm = 7][12-bit rastgele][2-bit varyant][62-bit rastgele]
48 bitlik Unix zamanı öneki, aynı milisaniyede üretilen UUID’lerin en anlamlı bitlerinin neredeyse aynı olmasını ve daha sonra üretilen UUID’lerin sözlüksel olarak daha büyük olmasını sağlar. Bu özellik, v7’yi B-tree indeksleri için ideal hale getirir.
Neden Rastgele UUID’ler Veritabanı Performansını Düşürür?
B-tree indeksleri (PostgreSQL, MySQL, SQL Server ve diğerleri tarafından kullanılır) sıralı düzeni korur. UUID v4 ile yeni anahtarlar 128 bitlik alan boyunca tekdüze rastgele dağılır. Yeni anahtar neredeyse hiçbir zaman indeksin sonunda olmaz ve bu sürekli sayfa bölünmelerine neden olur.
UUID v7 ile yeni anahtarlar her zaman önceki anahtarlardan büyüktür (aynı milisaniye içinde). Ekleme işlemleri B-tree’nin en sağ yaprak sayfasına gider, sayfalar sırayla dolar ve bölünmeler nadirdir.
Hangi Sürümü Ne Zaman Kullanmalı?
UUID v4 kullanın:
- Güvenlik tokenları, API anahtarları, oturum ID’leri veya şifre sıfırlama tokenları üretirken (öngörülemezlik önemlidir)
- ID’ler veritabanı birincil anahtarı olarak kullanılmıyorsa
- Geniş uyumluluk gerekiyorsa (v4, 20 yıldır her dilde ve kütüphanede mevcuttur)
UUID v7 kullanın:
- UUID’leri veritabanı birincil anahtarı olarak kullanırken (özellikle yüksek yazma hızlarında)
- Kronolojik olarak karşılaştırılabilir, sıralanabilir ID’lere ihtiyacınız varsa
- Dağıtık bir sistem tasarlıyorsanız ve koordinasyon yükünü azaltmak istiyorsanız
- Olay günlüğü, denetim izi veya ekleme sırasının önemli olduğu sistemlerde