Bu bölümde, Firestore Enterprise sürümü için dizine ekleme işlemi açıklanmaktadır. Firestore Enterprise sürümü varsayılan olarak dizin oluşturmaz. Maliyetleri azaltmak ve veritabanı performansını artırmak için en çok tercih edilen sorgularınıza yönelik dizinler oluşturun.
Dizinlerin, veritabanının performansı üzerinde büyük bir etkisi vardır. Bir sorgu için dizin varsa veritabanı, taranması gereken veri miktarını ve sonuçları sıralamak için gereken işi azaltarak sonuçları verimli bir şekilde döndürebilir. Ancak dizin girişleri, depolama maliyetlerini ve dizine eklenen alanlarda yazma işlemi sırasında yapılan iş miktarını artırır.
Dizin tanımı ve yapısı
Dizin aşağıdakilerden oluşur:
- Koleksiyon kimliği
- Belirli bir koleksiyondaki alanların listesi
- Her alan için artan, azalan veya dizi içeren bir dizin modu
Bir dizin, seyrek veya benzersiz seçeneklerini de etkinleştirebilir.
Dizin sıralaması
Her alanın sırası ve sıralama yönü, dizini benzersiz şekilde tanımlar. Örneğin, aşağıdaki dizinler iki farklı dizindir ve birbirinin yerine kullanılamaz:
| Toplama | Alanlar |
|---|---|
| şehirler | ülke (artan), nüfus (azalan) |
| şehirler | nüfus (azalan), ülke (artan), |
Bir sorguyu desteklemek için dizin oluştururken alanları sorgunuzla aynı sırayla ekleyin.
Dizin yoğunluğu
Varsayılan olarak dizin girişleri, bir koleksiyondaki tüm dokümanların verilerini depolar. Bu, seyrek olmayan dizin olarak bilinir. Dizinde belirtilen alanlardan herhangi birini içerip içermediğine bakılmaksızın doküman için bir dizin girişi eklenir. Dizin girişleri oluşturulurken mevcut olmayan alanlar NULL değerine sahip olarak kabul edilir. Bu davranışı değiştirmek için dizini seyrek dizin olarak tanımlayabilirsiniz.
Seyrek dizinler
Seyrek dizin, koleksiyonda yalnızca dizine eklenen alanlardan en az biri için değer (boş değer dahil) içeren dokümanları dizine ekler. Seyrek dizin, depolama maliyetlerini azaltır ve performansı artırabilir.
Dizi içeren dizinler
array-contains veya array-contains-any kullanarak bir dizi alanını sorgularken sorgu performansını optimize etmek için alanı array-contains modunda dizine ekleyebilirsiniz. Bir dizinde array-contains modunda en fazla bir alan olabilir.
Sorgu motoru, bir dizi alanını array-contains modunda dizine ekleyerek belirli dizi değerlerini içeren belgeleri hızlı bir şekilde bulabilir. Dizin yoksa sorgular, koleksiyonun tam taramasını gerçekleştirerek dizi değerlerini kontrol eder. Bu da koleksiyonun boyutu büyüdükçe sorgu gecikmelerini ve okuma maliyetlerini artırır.
Bir dizi alanını dizine eklemek için alanın aşağıdaki koşulu karşılaması gerekir:
- Boş olmayan dizi koşulu: Yalnızca dokümanda dizi alanı varsa ve bu alan boş olmayan bir diziyse dizin girişi oluşturulur. Eksik, dizi olmayan veya boş dizi alanları içeren belgeler dizine eklenmez.
Yoğunluğun array-contains dizinleriyle ilişkisi
array-contains alanı içeren dizinlerde, dizin yoğunluğu kuralları yalnızca sıralı dizine eklenmiş alanlar için geçerlidir. Boş olmayan dizi koşulu karşılanırsa yoğunluk kuralları, dizindeki kalan sıralı dizine eklenmiş alanlara uygulanır:
- Seyrek olmayan dizin (
DENSE): Doküman için bir dizin girişi oluşturulur. Dizindeki eksik sıralı dizine eklenmiş alanlar, dizin girişindenullolarak depolanır. - Seyrek dizin (
SPARSE): Yalnızca sıralı dizine eklenmiş alanlardan en az biri dokümanda mevcutsa dizin girişi oluşturulur.
Örnek: Dizin girişi oluşturma
users (tags[*], status ASC) dizinini ele alalım:
| Doküman | NON-SPARSE endeks |
SPARSE endeks |
|---|---|---|
{ |
Dizine eklendi: • (etiketler: "news", durum: "active") |
Dizine eklendi: • (etiketler: "news", durum: "active") |
{ |
Dizine eklendi: • (etiketler: "news", durum: "active") • (etiketler: "sports", durum: "active") |
Dizine eklendi: • (etiketler: "news", durum: "active") • (etiketler: "sports", durum: "active") |
{ |
Dizine eklendi: • (etiketler: "news", durum: "active") (tekilleştirilmiş) |
Dizine eklendi: • (etiketler: "news", durum: "active") (tekilleştirilmiş) |
{ |
Dizine eklendi: • (etiketler: null, durum: "active") |
Dizine eklendi: • (etiketler: null, durum: "active") |
{ |
Dizine eklendi: • (etiketler: "news", durum: null) |
Dizine eklenmedi (status alanı eksik) |
{ |
Dizine eklenmedi (alan bir dizi değil) | Dizine eklenmedi (alan bir dizi değil) |
{ |
Dizine eklenmedi (alan bir dizi değil) | Dizine eklenmedi (alan bir dizi değil) |
{ |
Dizine eklenmedi (tags alanı eksik) |
Dizine eklenmedi (tags alanı eksik) |
{ |
Dizine eklenmedi (boş dizi) | Dizine eklenmedi (boş dizi) |
Sorgu örneği
Web
// Query for users where 'tags' contains 'news' and 'status' is 'active' const query = db.collection("users") .where("tags", "array-contains", "news") .where("status", "==", "active"); // Documents returned by the query: // [ // { // "id": "alice", // "tags": ["news", "tech"], // "status": "active" // } // ]
Benzersiz dizinler
Dizine eklenen alanlar için benzersiz değerleri zorunlu kılmak üzere benzersiz dizin seçeneğini ayarlayın. Birden fazla alan içeren dizinlerde, her değer kombinasyonu dizin genelinde benzersiz olmalıdır. Veritabanı, yinelenen değerlere sahip dizin girişleri oluşturmaya çalışan tüm güncelleme ve ekleme işlemlerini reddeder. Dizine eklenen alanların verileri yinelenen değerler içeriyorsa ve benzersiz bir dizin oluşturmaya çalışırsanız dizin oluşturma işlemi başarısız olur ve işlem ayrıntılarında bir hata mesajı gösterilir.
Benzersiz bir dizinde eksik alanlar
Benzersiz dizin için eksik alanları olan bir doküman eklerseniz dizin, eksik alanlar için null değerlerini ayarlar. Oluşturulan dizin girişi benzersiz olmalıdır. Aksi takdirde işlem başarısız olur.
Örneğin, şu dizinde:
| Toplama | Dizine eklenen alanlar | Sorgu kapsamı |
|---|---|---|
| şehirler | ad (artan) | Toplama |
{"abbreviation": "LA"} dokümanını koleksiyona eklerseniz benzersiz dizin, name değeri null olarak ayarlanmış bir giriş oluşturur. Ardından {"abbreviation": "NYC"} dokümanını eklemeye çalışırsanız benzersiz dizin için elde edilen giriş aynı olduğundan işlem başarısız olur.
Aynı davranış, birden fazla alan içeren benzersiz dizinler için de geçerlidir.
Bir doküman oluşturulurken veya güncellenirken eksik dizine eklenmiş alanlar null olarak ayarlanır ve sonuçta elde edilen dizin girişinin dizinde benzersiz olması gerekir.
Dizi değerlerinde benzersiz dizinler
Benzersiz bir array-contains dizini, çakışan dizi öğeleri içeren dokümanlara izin vermez.
Bu tür dizinler, bir dizinin tek bir dokümanda benzersiz değerlere sahip olmasını zorunlu kılmaz.
Örneğin, tags adlı bir alanda benzersiz bir dizin varsa:
Aşağıdaki doc1 dokümanı eklenmeye uygun:
{
"tags": [ "news", "tech", "news", "music" ]
}
Dizin, tek bir dokümanın aynı dizisinde yinelenen değerlere ("news") izin verir.
Yinelenen bir öğe içeren ikinci bir doküman (doc2) eklemeye çalışırsanız işlem başarısız olur:
{
"tags": [ "sports", "music" ]
}
"music", doc1 dizisinde zaten mevcut olduğundan ve dizinde eşlendiğinden işlem başarısız oluyor.
Tek bir dokümandaki aynı dizide bulunan öğelerin benzersiz olmasını sağlamanız gerekiyorsa bunu uygulama mantığınızda ele alın.
Boş diziler, eksik alanlar ve boş değerler
Normalde, benzersiz bir dizindeki eksik alanlar null olarak değerlendirilir ve belgeler arasında benzersiz olmalıdır (Benzersiz bir dizindeki eksik alanlar bölümüne bakın).
Ancak dizi alanlarındaki benzersiz dizinler için:
- Boş diziler, eksik alanlar ve bağımsız null değerleri: Dizi alanı boşsa, tamamen eksikse veya bağımsız bir
nulldeğeri barındırıyorsa (dizi içinde değil) doküman için dizin anahtarı oluşturulmaz. Bu nedenle, birden fazla dokümanda boş alanlar veya bağımsıznulldeğerleri bulunabilir ve yinelenen anahtar hataları tetiklenmez. - Dizi içindeki boş öğeler: Dizi, öğe olarak
nulldeğeri içeriyorsa (örneğin,["news", null])nullöğesi dizine eklenir. Dizine eklenmiş dizi alanındanullöğesi içeren sonraki tüm dokümanlar, yinelenen anahtar hatasıyla başarısız olur.
Dizin oluşturma hatalarını giderme
Dizinlerinizi yönetirken dizin oluşturma hatalarıyla karşılaşabilirsiniz. Veritabanında verilerle ilgili bir sorunla karşılaşılırsa dizine ekleme işlemi başarısız olabilir. Dizine ekleme işlemleri aşağıdaki nedenlerle başarısız olabilir:
- Dizin sınırına ulaştınız. Örneğin, işlem, doküman başına maksimum dizin girişi sayısına ulaşmış olabilir. Dizin oluşturma işlemi başarısız olursa bir hata mesajı görürsünüz. Dizin sınırına ulaşmadıysanız dizin işlemini tekrar deneyin.
- Benzersiz dizin seçeneğini ayarladınız ve dizine eklenen alanların verileri yinelenen dizin girişleri oluşturuyor. Devam etmek için verilerdeki yinelenen değer kombinasyonlarını kaldırın.
Sırada ne var?
Dizin oluşturma ve yönetme hakkında bilgi edinin.