# IndexedDB vs localStorage

Adres: https://softwaredictionary.org/tr/karsilastirma/indexeddb-vs-local-storage
Son güncelleme: 2026-10-06

Kısaca: localStorage, metin saklayan küçük ve senkron bir depodur; IndexedDB ise büyük yapılandırılmış veriler ve dosyalar için asenkron bir tarayıcı veritabanıdır.

## IndexedDB ile localStorage arasındaki fark nedir?

İkisi de veriyi tarayıcıda, kullanıcının cihazında, her origin için ayrı tutar. `localStorage` basit bir anahtar-değer deposudur: metin anahtarlar altında metinler saklar; veri `setItem` ile yazılır, `getItem` ile okunur. IndexedDB ise tarayıcıya yerleşik eksiksiz bir veritabanıdır: object store'lar JavaScript nesnelerini anahtarlar altında tutar, indeksler kayıtları başka alanlara göre bulur, transaction'lar da ya tamamı başarılı olan ya da hiçbiri gerçekleşmeyen yazmaları gruplar.

Asıl farklar boyut, veri modeli ve zamanlamadır. `localStorage` origin başına yaklaşık 5 MB ile sınırlıdır ve yalnızca metin saklar; bu yüzden nesneler `JSON.stringify`'dan geçer. Çağrıları da senkrondur ve çalışırken sayfayı bekletir. IndexedDB ise genellikle boş diskin büyük bir bölümünü kullanabilir, nesneleri, tarihleri ve dosyaları doğrudan saklar ve asenkrondur; böylece büyük okuma ve yazmalar arayüzü dondurmaz. Ayrıca `localStorage`'ın bulunmadığı web worker'larda ve service worker'larda da çalışır.

IndexedDB kullanan birçok uygulama `localStorage`'ı da kullanır. Tema, dil ya da bir özellik bayrağı (feature flag), sayfanın hemen istediği birkaç baytlık veridir, bu yüzden `localStorage` daha basittir; çevrimdışı bir posta kutusu, önbelleğe alınmış API yanıtları ya da binlerce taslaktan oluşan bir liste ise IndexedDB'ye aittir. Ham IndexedDB API'si uzun ve olay tabanlıdır; bu yüzden pek çok proje, promise desteği ekleyen `idb` ya da Dexie.js gibi küçük bir sarmalayıcı kullanır.

Sık yapılan bir yanlış, IndexedDB'nin tarayıcıdaki bir SQL veritabanı olduğu düşüncesidir. Tablo ya da sorgu yoktur; yalnızca anahtarlar, indeksler ve kayıtları tek tek dolaşan cursor'lar vardır. Bir başkası, iki deponun da kalıcı ya da gizli olduğu düşüncesidir: `navigator.storage.persist()` izni verilmedikçe tarayıcılar yer azaldığında ikisini de silebilir ve XSS ile enjekte edilen betik dahil sayfadaki her betik ikisini de okuyabilir.

| Özellik | IndexedDB | Local Storage |
| --- | --- | --- |
| Tür | Object store'ları, indeksleri ve transaction'ları olan eksiksiz bir veritabanı | Basit bir anahtar-değer deposu |
| Saklanan veri | Nesneler, diziler, tarihler ve dosyalar, dönüştürmeden | Yalnızca metin; nesneler `JSON.stringify`'dan geçer |
| Kapasite | Boş diske bağlı olarak çoğu zaman yüzlerce megabayt ya da daha fazlası | Origin başına yaklaşık 5 MB |
| API tarzı | Asenkron: olaylı istekler ya da bir sarmalayıcıyla promise'ler | Senkron: her çağrı bitene kadar sayfayı bekletir |
| Arama | Anahtarla, indeks aralıklarıyla ve cursor'larla | Yalnızca tam anahtarla |
| Transaction'lar | Var; bir grup yazma bütün olarak ya başarılı ya da başarısız olur | Yok; her `setItem` tek başınadır |
| Worker'larda | Web worker'larda ve service worker'larda kullanılabilir | Yalnızca sayfanın kendisinde, worker'larda değil |
| En uygun olduğu yer | Çevrimdışı veri, önbelleğe alınmış API yanıtları, büyük listeler, dosyalar | Küçük ayarlar: tema, dil, bayraklar, kısa bir taslak |

## IndexedDB şu durumlarda doğru seçim

- Çevrimdışı kayıt kopyası ya da dosyalar gibi çok miktarda veri saklıyorsunuz.
- Kayıtları anahtar dışındaki alanlara göre aramanız gerekiyor.
- Birkaç yazmanın birlikte başarılı ya da başarısız olması gerekiyor.
- Veriye bir web worker'ın ya da service worker'ın ihtiyacı var.

## Local Storage şu durumlarda doğru seçim

- Tema ya da kapatılmış bir banner gibi birkaç küçük değer saklıyorsunuz.
- Sayfa değeri hemen okumalı; örneğin temayı ilk boyamadan (first paint) önce uygulamak için.
- Basitlik, kapasiteden ya da yapıdan daha önemli.

## Sık sorulan sorular

**IndexedDB, localStorage'dan ne kadar fazla veri saklayabilir?**

Çok daha fazla. `localStorage` origin başına yaklaşık 5 MB'ta durur; IndexedDB ise origin'in depolama kotasını paylaşır ve bu kota modern tarayıcılarda çoğu zaman yüzlerce megabayt ya da daha fazladır. Gerçek değeri `navigator.storage.estimate()` bildirir.

**localStorage, IndexedDB'den daha mı hızlı?**

Tek ve küçük bir değer için `localStorage`'ı okumak hızlıdır ve `await` gerektirmez. Çok sayıda ya da büyük kayıtta ise daha kötüdür, çünkü her çağrı sayfayı bekletir; IndexedDB ise asenkron çalışır ve yalnızca bir indeksin gösterdiği kayıtları getirebilir.

**IndexedDB'yi bir service worker'da kullanabilir miyim?**

Evet; orada çevrimdışı verinin olağan yeri de odur. `localStorage` ise service worker'larda ve diğer web worker'larda kullanılamaz.

---

Software Dictionary: https://softwaredictionary.org/tr · https://softwaredictionary.org/tr/llms.txt
