Furkan KapukayaYazılım geliştirme
Backend, API ve Veritabanı3 dk okuma

UUIDv7 Nedir? Zaman Sıralı Kimlikler ve Veritabanı Performansı

UUIDv7'nin yapısı, UUIDv4 ve otomatik artan sayılarla karşılaştırma, B-tree indeks performansına etkisi, PostgreSQL 18 uuidv7(), .NET Guid.CreateVersion7(), SQL Server'da dikkat edilecekler ve güvenlik notları.

Bir tabloya birincil anahtar seçerken geliştiricilerin klasik ikilemi şudur: Otomatik artan sayı mı (1, 2, 3...), yoksa UUID mi? Otomatik artan sayılar küçük ve hızlıdır ama tahmin edilebilir ve dağıtık sistemlerde zorluk çıkarır. Rastgele UUID'ler (UUIDv4) her yerde benzersiz üretilebilir ama indeks performansını bozar. UUIDv7 bu iki dünyanın arasında bir çözüm sunuyor ve 2024'te yayımlanan RFC 9562 ile standartlaştı. 2026'da .NET, PostgreSQL ve pek çok dil bunu yerleşik olarak destekliyor.

UUIDv7'nin yapısı

UUIDv7 de 128 bitlik standart bir UUID'dir; farkı içeriğinin düzenindedir:

  • İlk 48 bit: Milisaniye cinsinden Unix zaman damgası.
  • Sürüm ve varyant bitleri.
  • Kalan bitler: Rastgele değer (ve bazı uygulamalarda aynı milisaniye içinde sıralamayı koruyan sayaç).

Sonuç: UUIDv7 değerleri, üretildikleri zamana göre kabaca sıralıdır. Örneğin 01936d9c-7b2a-7c3e-9f41-... ile başlayan bir kimlik, kendisinden sonra üretilen bir kimlikten küçüktür.

Neden önemli? İndeks performansı

Veritabanlarının çoğu birincil anahtarı B-tree yapısında tutar. Rastgele UUIDv4 değerleri, her yeni kaydı indeksin rastgele bir yerine eklemeye zorlar. Bu da sayfa bölünmelerine, önbellek verimsizliğine ve zamanla şişen indekslere yol açar. Zaman sıralı UUIDv7 ise yeni kayıtları indeksin sonuna ekler; davranışı otomatik artan sayıya çok benzer. Yüksek hacimli tablolarda ekleme hızı ve indeks boyutu farkı belirgindir. İndekslerin çalışma mantığı için veritabanı indeksi yazımıza bakın.

Karşılaştırma

  • Otomatik artan sayı (int/bigint): En küçük ve en hızlı. Ancak tahmin edilebilir (kayıt sayısını sızdırır), birden fazla sunucuda veya çevrimdışı istemcide çakışmasız üretmek zordur.
  • UUIDv4: Her yerde üretilebilir, tahmin edilemez. Ancak indeks performansı zayıf, sıralanamaz.
  • UUIDv7: Her yerde üretilebilir, zamana göre sıralı, indeks dostu. Oluşturma zamanını açığa çıkarır.

Nasıl üretilir?

.NET

// .NET 9 ve sonrası
Guid id = Guid.CreateVersion7();

PostgreSQL 18

CREATE TABLE randevu (
  id uuid PRIMARY KEY DEFAULT uuidv7(),
  baslangic timestamptz NOT NULL
);

Ayrıntılar için PostgreSQL 18 yenilikleri yazımıza bakabilirsiniz.

Diğer diller

JavaScript, Python, Go, PHP ve Java için standart kütüphane veya yaygın paketlerde UUIDv7 desteği bulunuyor. Kullanmadan önce kütüphanenin RFC 9562'ye uygun olduğunu kontrol edin.

SQL Server'da dikkat

SQL Server, uniqueidentifier değerlerini karşılaştırırken byte'ları standart UUID sırasından farklı bir sırayla değerlendirir. Bu nedenle .NET'te üretilen UUIDv7 değerleri SQL Server'da beklendiği gibi "sonuna eklenmeyebilir". SQL Server kullanıyorsanız:

  • Yerleşik NEWSEQUENTIALID() fonksiyonunu değerlendirin (yalnızca varsayılan değer olarak kullanılabilir).
  • Veya SQL Server'ın sıralama düzenine uygun sıralı GUID üreten bir kütüphane kullanın.
  • Kümelenmiş indeksi (clustered index) ayrı bir artan sütuna verip UUID'yi benzersiz indeksli bir sütun olarak tutmak da yaygın bir çözümdür.

Performans ayarları için SQL Server performans yazımıza göz atın.

Güvenlik notları

  1. UUIDv7 içinde oluşturma zamanı açıkça bulunur. Bir kaydın ne zaman oluşturulduğu hassas bir bilgiyse (örneğin kullanıcı hesabı oluşturma zamanı), bunu dikkate alın.
  2. Rastgele kısım tahmin edilmesi zor olsa da UUID'ler yetkilendirme yerine geçmez. URL'de UUID kullanmak, kaynağa erişim kontrolü yapmama gerekçesi olamaz.
  3. Herkese açık bağlantılarda (ör. randevu iptal bağlantısı) ayrı, kısa ömürlü ve rastgele bir token kullanmak daha doğrudur.

Sık sorulan sorular

Mevcut tablolarımı UUIDv7'ye çevirmeli miyim?

Genellikle gerekmez. Yeni tablolarda ve yüksek hacimli yeni sistemlerde tercih edin; mevcut anahtarları değiştirmek büyük ve riskli bir iştir.

UUIDv7 ile ULID arasındaki fark ne?

İkisi de zaman sıralı kimliklerdir. ULID farklı bir metin gösterimi kullanır; UUIDv7 ise standart UUID biçimindedir ve veritabanlarının UUID tipleriyle doğrudan uyumludur.

Aynı milisaniyede üretilen kimlikler sıralı mı?

Uygulamaya bağlıdır. Bazı kütüphaneler aynı milisaniye içinde sayaç kullanarak sırayı korur; bazıları rastgele bitlere güvenir.

Sonuç

UUIDv7, dağıtık sistemlerin esnekliğini otomatik artan anahtarların indeks performansıyla birleştiriyor. Yeni projelerde birincil anahtar seçerken güçlü bir varsayılan. Veritabanı tasarımı ve performans danışmanlığı için bize ulaşın.

  • #UUIDv7
  • #Veritabanı
  • #Backend
  • #dotnet
  • #PostgreSQL
  • #YazılımMimarisi