Tüm Notlar
Database2025-12-01

Neden UUID Yerine ULID Tercih Ediyorum?

Dağıtık sistemlerde Primary Key krizleri: UUID'nin B-Tree indekslerini nasıl parçaladığını ve ULID'nin bunu nasıl çözdüğünü production deneyimlerimle anlatıyorum.

ID Seçimi: Masum Bir Kararın Ağır Bedeli

Yazılım mimarisinde "Primary Key ne olsun?" sorusu genellikle "Auto Increment ID kullanalım geçelim" veya "Modern olsun UUID v4 yapalım" şeklinde hızlıca geçiştirilir. Ancak dağıtık sistemlerde ve yüksek hacimli veritabanlarında bu kararın bedelini 6 ay sonra ödemeye başlarsınız.

UUID v4: Veritabanı Katili

UUID (Universally Unique Identifier) harikadır çünkü merkezi bir otoriteye ihtiyaç duymadan unique ID üretebilirsiniz. Ancak tamamen rastgele olması, veritabanı performansının en büyük düşmanıdır.

MySQL ve PostgreSQL gibi ilişkisel veritabanları, veriyi disk üzerinde B-Tree yapısında tutar. Bu yapı, verinin sıralı gelmesini sever. Rastgele dağılmış bir UUID v4'ü insert etmeye çalıştığınızda:

  1. Veritabanı, ID'nin ağaçta nereye gireceğini bulmak için rastgele bir sayfayı (page) belleğe yüklemek zorunda kalır.
  2. Bu, "Page Splitting" (sayfa bölünmesi) olasılığını artırır.
  3. Index fragmantasyonu %99'lara ulaşır.
  4. Disk I/O maliyetiniz katlanarak artar.

Bir e-ticaret projemizde, sırf UUID v4 yüzünden veritabanı boyutunun %30 daha fazla şiştiğini ve sorgu performansının yarı yarıya düştüğünü bizzat tecrübe ettim.

Kurtarıcı: ULID

ULID (Universally Unique Lexicographically Sortable Identifier), UUID'nin en iyi özelliklerini alır ve kritik bir eklenti yapar: Zaman Damgası.

01ARZ3NDEKTSV4RRFFQ69G5FAV

  • İlk 48 bit: Unix Timestamp (milisaniye).
  • Son 80 bit: Rastgelelik.

Bu yapı sayesinde:

  1. Sıralanabilir: ID'ler oluşturulma zamanına göre kabaca sıralıdır.
  2. Veritabanı Dostu: Yeni kayıtlar B-Tree'nin sonuna eklenir (Append-only'ye yakın performans).
  3. Okunabilir: URL'lerde % karakterleri olmadan temiz durur.
  4. Hızlı: UUID v4 ile aynı collision direncine sahiptir.

Karar Anı

Eğer "Big Data" (milyarlarca satır) seviyesinde bir iş yapmıyorsanız Auto Increment ID hala en performanslısıdır. Ancak ID'leri dış dünyaya açıyorsanız (URL'de user/1 tahmin edilebilirliği güvenlik riskidir) veya dağıtık bir sistem kuruyorsanız, ULID şu an için altın standarttır. UUID v7 de benzer bir yaklaşımla geliyor, ancak ULID kütüphane desteği ve sadeliğiyle benim ilk tercihim.