Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

Cloud Firestore'daki dizin türleri

Dizinler, bir veritabanının performansında önemli bir faktördür. Bir kitaptaki konuları sayfa numaralarına eşleyen bir kitabın dizini gibi, bir veritabanı dizini de bir veritabanındaki öğeleri veritabanındaki konumlarına eşler. Bir veritabanına sorgu gönderdiğinizde, veritabanı, istediğiniz öğelerin konumlarını hızlı bir şekilde aramak için bir dizin kullanabilir.

Bu sayfa Bulut Firestore kullanır endeksler, iki tür açıklar tek alan endeksler ve kompozit endekslerinin .

Her sorgunun arkasında bir dizin

Bir sorgu için dizin yoksa, çoğu veritabanları içeriklerini öğe madde tarar; bu, veri tabanı büyüdükçe daha da yavaşlayan yavaş bir işlemdir. Bulut Firestore tüm sorgular için endeksleri kullanılarak yüksek sorgu performansı garanti eder. Sonuç olarak, sorgu performansı, veritabanındaki öğe sayısına değil, sonuç kümesinin boyutuna bağlıdır.

Daha az dizin yönetimi, daha fazla uygulama geliştirme

Cloud Firestore, dizinleri yönetmek için harcamanız gereken süreyi azaltan özellikler içerir. En temel sorgular için gereken dizinler sizin için otomatik olarak oluşturulur. Kullanmak uygulamanızı test ederken, Bulut Firestore belirlemek ve yardımcı ek dizinler oluşturmak uygulama gerektirir.

Dizin türleri

Tek alanını ve kompozit: Bulut Firestore endeksler iki tür kullanır. Dizine alınan alan sayısının yanı sıra, tek alanlı ve bileşik dizinler bunları nasıl yönettiğinize göre farklılık gösterir.

Tek alan dizinleri

Tek alan dizini, belirli bir alanı içeren bir koleksiyondaki tüm belgelerin sıralanmış bir eşlemesini depolar. Tek alanlı bir dizindeki her giriş, belirli bir alan için bir belgenin değerini ve belgenin veritabanındaki konumunu kaydeder. Cloud Firestore, birçok temel sorguyu gerçekleştirmek için bu dizinleri kullanır. Veritabanınızın otomatik dizin oluşturma ayarlarını ve dizin muafiyetlerini yapılandırarak tek alan dizinlerini yönetirsiniz.

Otomatik indeksleme

Varsayılan olarak Cloud Firestore, bir belgedeki her alan ve bir haritadaki her bir alt alan için otomatik olarak tek alanlı dizinler tutar. Cloud Firestore, tek alanlı dizinler için aşağıdaki varsayılan ayarları kullanır:

  • Her bir dizi olmayan ve non-harita alanı için bulut Firestore iki tanımlar toplama kapsamı tek alan indeksler, artan modunda bir modu ve azalan bir.

  • Cloud Firestore, her harita alanı için, haritadaki dizi olmayan ve harita olmayan her alt alan için bir koleksiyon kapsamı artan dizini ve bir azalan dizin oluşturur.

  • Cloud Firestore, bir belgedeki her dizi alanı için koleksiyon kapsamında dizi içeren bir dizini oluşturur ve sürdürür.

  • Koleksiyon grubu kapsamına sahip tek alan dizinleri varsayılan olarak korunmaz.

Tek alanlı dizin muafiyetleri

Eğer bir alan dışında bırakabilirsiniz otomatik indeksleme tek alan indeksi muafiyet oluşturarak ayarlarda. Bir dizin oluşturma muafiyeti, veritabanı genelindeki otomatik dizin ayarlarını geçersiz kılar. Bir muafiyet, otomatik dizin oluşturma ayarlarınızın aksi takdirde otomatik dizin oluşturmanın etkinleştireceği tek alanlı bir dizini devre dışı bırakacağı veya devre dışı bırakacağı tek alanlı bir dizini etkinleştirebilir. Muafiyetler yararlı olabilir durumlar için, bkz indeksleme iyi uygulamaları .

Bir harita alanı için tek alanlı bir dizin muafiyeti oluşturursanız, haritanın alt alanları bu ayarları devralır. Ancak, belirli alt alanlar için tek alanlı dizin muafiyetleri tanımlayabilirsiniz. Bir alt alan için bir muafiyeti silerseniz, alt alan, varsa üst öğesinin muafiyet ayarlarını veya herhangi bir ebeveyn muafiyeti yoksa veritabanı genelindeki ayarları devralır.

Oluşturmak ve tek alan indeksi muafiyetleri yönetmek için bkz Bulut Firestore içinde dizinleri yönetme .

Bileşik dizinler

Bileşik dizin, dizine eklenecek alanların sıralı listesine dayalı olarak bir koleksiyondaki tüm belgelerin sıralanmış bir eşlemesini depolar.

Cloud Firestore, tek alanlı dizinler tarafından halihazırda desteklenmeyen sorguları desteklemek için bileşik dizinler kullanır.

Cloud Firestore, çok sayıda olası alan kombinasyonu nedeniyle tek alanlı dizinlerde olduğu gibi otomatik olarak bileşik dizinler oluşturmaz. Bunun yerine, Bulut Firestore sen yardımcı belirlemek ve gerekli kompozit endeksler oluşturmak uygulamanızı oluşturmak gibi.

Yukarıdaki sorguyu önce gerekli dizini oluşturmadan denerseniz Cloud Firestore, eksik dizini oluşturmak için izleyebileceğiniz bir bağlantı içeren bir hata mesajı verir. Bu, bir dizin tarafından desteklenmeyen bir sorgu denediğinizde gerçekleşir. Ayrıca tanımlayabilir ve konsolu kullanarak veya kullanarak el kompozit endeksleri yönetebilir Firebase CLI . Oluşturma ve kompozit endeksleri yönetme hakkında daha fazlası için bkz dizinleri yönetme .

Dizin modları ve sorgu kapsamları

Tek alanlı ve bileşik dizinleri farklı şekilde yapılandırırsınız, ancak her ikisi de dizinleriniz için dizin modları ve sorgu kapsamları yapılandırmanızı gerektirir.

Dizin modları

Bir indeks tanımladığınızda, indekslenen her alan için bir indeks modu seçersiniz. Her alanın dizin modu, o alandaki belirli sorgu yan tümcelerini destekler. Aşağıdaki indeks modlarından birini seçebilirsiniz:

dizin modu Açıklama
artan Destekler < , <= , == , >= , > , ve in sorgu alanına maddeleri ve artan düzende sonuçlarını sıralamak desteklerin bu alan değerine dayalı.
Azalan Destekler < , <= , == , >= , > , ve in sorgu alanına maddeleri ve bu alan değerine dayanarak azalan sırada sonuçlarını sıralamak desteklerin.
dizi-içerir Destekler array-contains ve array-contains-any alanda sorgu maddeleri.

Sorgu kapsamları

Her dizin, bir koleksiyona veya bir koleksiyon grubuna göre kapsamlandırılır. Bu, dizinin sorgu kapsamı olarak bilinir:

Koleksiyon kapsamı
Cloud Firestore, varsayılan olarak koleksiyon kapsamına sahip dizinler oluşturur. Bu dizinler, tek bir koleksiyondan sonuç döndüren sorguları destekler.

Koleksiyon grubu kapsamı
Bir koleksiyon grubu, aynı koleksiyon kimliğine sahip tüm koleksiyonları içerir. Bir çalıştırmak için toplama grubu sorgusu döner filtre edilmiş veya toplama grubundan sonuçları sıralı göre, toplama grubu kapsamı ile ilgili bir dizin oluşturmak gerekir.

İndeksleme örneği

Cloud Firestore, sizin için otomatik olarak tek alanlı dizinler oluşturarak uygulamanızın en temel veritabanı sorgularını hızla desteklemesini sağlar. Tek alanlı endeksleri Eğer alan değerlerine ve Karşılaştırıcıların dayalı basit sorguları gerçekleştirmek için izin < , <= , == , >= , > , ve in . Dizi alanları için, onlar gerçekleştirmek için izin array-contains ve array-contains-any sorgular.

Örneklemek için, aşağıdaki örnekleri dizin oluşturma açısından inceleyin. Aşağıdaki kod parçası birkaç yaratır city bir belge cities toplama ve ayarlar name , state , country , capital , population ve tags her doküman için alanlar:

var citiesRef = db.collection("cities");

citiesRef.doc("SF").set({
    name: "San Francisco", state: "CA", country: "USA",
    capital: false, population: 860000,
    regions: ["west_coast", "norcal"] });
citiesRef.doc("LA").set({
    name: "Los Angeles", state: "CA", country: "USA",
    capital: false, population: 3900000,
    regions: ["west_coast", "socal"] });
citiesRef.doc("DC").set({
    name: "Washington, D.C.", state: null, country: "USA",
    capital: true, population: 680000,
    regions: ["east_coast"] });
citiesRef.doc("TOK").set({
    name: "Tokyo", state: null, country: "Japan",
    capital: true, population: 9000000,
    regions: ["kanto", "honshu"] });
citiesRef.doc("BJ").set({
    name: "Beijing", state: null, country: "China",
    capital: true, population: 21500000,
    regions: ["jingjinji", "hebei"] });

Varsayılan otomatik dizin oluşturma ayarlarını varsayarsak, Cloud Firestore, dizi olmayan alan başına bir artan tek alan dizini, dizi olmayan alan başına azalan bir tek alan dizini ve dizi alanı için bir dizi içeren tek alan dizini günceller. Aşağıdaki tablodaki her satır, tek alanlı bir dizindeki bir girişi temsil eder:

Toplamak Alan dizine eklendi Sorgu kapsamı
şehirler adı Toplamak
şehirler devlet Toplamak
şehirler ülke Toplamak
şehirler sermaye Toplamak
şehirler nüfus Toplamak
şehirler adı Toplamak
şehirler devlet Toplamak
şehirler ülke Toplamak
şehirler sermaye Toplamak
şehirler nüfus Toplamak
şehirler array-contains bölgeleri Toplamak

Tek alanlı dizinler tarafından desteklenen sorgular

Otomatik olarak oluşturulan bu tek alanlı dizinleri kullanarak aşağıdaki gibi basit sorgular çalıştırabilirsiniz:

const stateQuery = citiesRef.where("state", "==", "CA");
const populationQuery = citiesRef.where("population", "<", 100000);
const nameQuery = citiesRef.where("name", ">=", "San Francisco");

Ayrıca oluşturabilir in ve bileşik eşitlik ( == ) sorguları:

citiesRef.where('country', 'in', ["USA", "Japan", "China"])

// Compound equality queries
citiesRef.where("state", "==", "CO").where("name", "==", "Denver")
citiesRef.where("country", "==", "USA")
         .where("capital", "==", false)
         .where("state", "==", "CA")
         .where("population", "==", 860000)

Bir aralık karşılaştırma kullanan bir bileşik sorgusu çalıştırmak gerekiyorsa ( < , <= , > , veya >= farklı bir alana göre sıralamak gerekirse) ya da, bir oluşturmalısınız bileşik endeksi o sorgu için.

array-contains indeks sorgulayabilir olanak regions dizi alan:

citiesRef.where("regions", "array-contains", "west_coast")
// array-contains-any and array-contains use the same indexes
citiesRef.where("regions", "array-contains-any", ["west_coast", "east_coast"])

Bileşik dizinler tarafından desteklenen sorgular

Cloud Firestore, tek alanlı dizinler tarafından halihazırda desteklenmeyen bileşik sorguları desteklemek için bileşik dizinler kullanır. Örneğin, aşağıdaki sorgular için bir bileşik dizine ihtiyacınız olacaktır:

citiesRef.where("country", "==", "USA").orderBy("population", "asc")
citiesRef.where("country", "==", "USA").where("population", "<", 3800000)
citiesRef.where("country", "==", "USA").where("population", ">", 690000)
// in and == clauses use the same index
citiesRef.where("country", "in", ["USA", "Japan", "China"])
         .where("population", ">", 690000)

Bu sorgular, aşağıdaki bileşik dizini gerektirir. Sorgu, bir eşitlik (kullandığından == veya in için) country alanına, bu alan için bir artan veya azalan endeks modunu kullanabilirsiniz. Varsayılan olarak, eşitsizlik yan tümceleri, eşitsizlik yan tümcesindeki alana dayalı olarak artan bir sıralama düzeni uygular.

Toplamak Alanlar dizine eklendi Sorgu kapsamı
şehirler (veya ) ülke nüfus Toplamak

Aynı sorguları çalıştırmak ancak azalan sıralama düzeni ile, sizin için inen yönde ek bir bileşik endeks ihtiyaç için population :

citiesRef.where("country", "==", "USA").orderBy("population", "desc")

citiesRef.where("country", "==", "USA")
         .where("population", "<", 3800000)
         .orderBy("population", "desc")

citiesRef.where("country", "==", "USA")
         .where("population", ">", 690000)
         .orderBy("population", "desc")

citiesRef.where("country", "in", ["USA", "Japan", "China"])
         .where("population", ">", 690000)
         .orderBy("population", "desc")
Toplamak Alanlar dizine eklendi Sorgu kapsamı
şehirler ülke nüfus Toplamak
şehirler ülke nüfus Toplamak

Ayrıca birleştirmek için bir bileşik dizin oluşturmak için gereken bir array-contains veya array-contains-any ek maddeleri ile sorgu.

citiesRef.where("regions", "array-contains", "east_coast")
         .where("capital", "==", true)

// array-contains-any and array-contains use the same index
citiesRef.where("regions", "array-contains-any", ["west_coast", "east_coast"])
         .where("capital", "==", true)
Toplamak Alanlar dizine eklendi Sorgu kapsamı
şehirler etiketleri, dizi-içeren (veya ) sermaye Toplamak

Koleksiyon grubu dizinleri tarafından desteklenen sorgular

Toplama grubu kapsamı ile bir dizin göstermek için, bir ekleme hayal landmarks bazı alt koleksiyonu city belgeler:

var citiesRef = db.collection("cities");

citiesRef.doc("SF").collection("landmarks").doc().set({
    name: "Golden Gate Bridge",
    category : "bridge" });
citiesRef.doc("SF").collection("landmarks").doc().set({
    name: "Golden Gate Park",
    category : "park" });

citiesRef.doc("DC").collection("landmarks").doc().set({
    name: "National Gallery of Art",
    category : "museum" });
citiesRef.doc("DC").collection("landmarks").doc().set({
    name: "National Mall",
    category : "park" });

Toplama kapsamı ile aşağıdaki tek alanlı bir dizin kullanarak, tek bir şehrin sorgulayabilir landmarks dayalı koleksiyon category alanında:

Toplamak Alanlar dizine eklendi Sorgu kapsamı
görülecek yer (veya ) kategorisi Toplamak
citiesRef.doc("SF").collection("landmarks").where("category", "==", "park")
citiesRef.doc("SF").collection("landmarks").where("category", "in", ["park", "museum"])

Şimdi, tüm şehirlerdeki yer işaretlerini sorgulamakla ilgilendiğinizi hayal edin. Bütün oluşan koleksiyon grubuna bu sorguyu çalıştırmak için landmarks koleksiyonları, bir etkinleştirmeniz gerekir landmarks toplama grubu kapsamı ile tek alanlı bir dizin:

Toplamak Alanlar dizine eklendi Sorgu kapsamı
görülecek yer (veya ) kategorisi Koleksiyon grubu

Bu endeks etkinleştirildiğinde, sorgulayabilir landmarks toplama grubu:

var landmarksGroupRef = db.collectionGroup("landmarks");

landmarksGroupRef.where("category", "==", "park")
landmarksGroupRef.where("category", "in", ["park", "museum"])

Filtrelenmiş veya sıralanmış sonuçlar döndüren bir koleksiyon grubu sorgusu çalıştırmak için, koleksiyon grubu kapsamına sahip ilgili tek alanlı veya bileşik dizini etkinleştirmeniz gerekir. Sonuçları filtrelemeyen veya sıralamayan koleksiyon grubu sorguları, ek dizin tanımları gerektirmez.

Örneğin, ek bir dizini etkinleştirmeden aşağıdaki koleksiyon grubu sorgusunu çalıştırabilirsiniz:

db.collectionGroup("landmarks").get()

Dizin girişleri

Projenizin yapılandırılmış endeksleri yanı sıra bir belgenin yapısı, hem sonuçta sayılmaz belge için dizin girişleri etkileyen endeksi giriş sayısı sınırı .

İşte açıklamak için bir örnek.

Belge

name : "San Francisco"
temperatures : {summer: 67, winter: 55}
neighborhoods : ["Mission", "Downtown", "Marina"]

Tek Alan İndeksleri

  • (Otomatik) adı ASC & DESC
  • (Otomatik) sıcaklıklar ASC ve DESC
  • (Otomatik) mahalleler Dizinin İçeriği

Bileşik İndeksler

  • adı ASC, mahalleler ASC
  • isim DESC, mahalleler ASC

Sonuç Endeks Girişleri

Bu dizin oluşturma yapılandırması, belge için aşağıdaki 12 dizin girişiyle sonuçlanır:

dizin giriş
ad ASC & DESC isim: "San Francisco"
sıcaklıklar ASC ve DESC sıcaklıklar.yaz: 67
sıcaklıklar ASC ve DESC sıcaklıklar.kış: 55
mahalleler Dizi İçerdiği mahalleler: "Misyon"
mahalleler Dizi İçerdiği mahalleler: "Şehir merkezi"
mahalleler Dizi İçerdiği mahalleler: "Marina"
adı ASC, mahalleler ASC isim: "San Francisco", mahalleler: "Misyon"
adı ASC, mahalleler ASC isim: "San Francisco", mahalleler: "Şehir merkezi"
adı ASC, mahalleler ASC isim: "San Francisco", mahalleler: "Marina"
isim DESC, mahalleler ASC isim: "San Francisco", mahalleler: "Misyon"
isim DESC, mahalleler ASC isim: "San Francisco", mahalleler: "Şehir merkezi"
isim DESC, mahalleler ASC isim: "San Francisco", mahalleler: "Marina"

Endeksler ve fiyatlandırma

Endeksleri katkıda depolama maliyetlerinin Başvurunuzun. Endeksler için depolama boyutu nasıl hesaplandığı hakkında daha fazlası için, bkz Endeksi giriş büyüklüğünü .

Dizin birleştirmeden yararlanma

Cloud Firestore, her sorgu için bir dizin kullansa da, sorgu başına mutlaka bir dizin gerektirmez. Birden eşitlik ile (sorguları için == isteğe) bentlerinde ve, bir orderBy maddesi, Bulut Firestore tekrar kullanma olanağına mevcut dizinleri. Cloud Firestore, daha büyük eşitlik sorguları için gereken bileşik dizinleri oluşturmak için basit eşitlik filtreleri için dizinleri birleştirebilir.

Dizin birleştirmeden yararlanabileceğiniz durumları belirleyerek dizin oluşturma maliyetlerini azaltabilirsiniz. Örneğin, bir hayal restaurants bir restoran değerlendirme uygulaması için koleksiyon:

  • restoran

    • burgerthyme

      name : "Burger Thyme"
      category : "burgers"
      city : "San Francisco"
      editors_pick : true
      star_rating : 4

Şimdi, bu uygulamanın aşağıdakilere benzer sorgular kullandığını hayal edin. İçin eşitlik maddelerinin uygulama kullanımları kombinasyonları olduğu Bildirimi category , city ve editors_pick daima artan göre sıralama yaparken star_rating :

db.collection("restaurants").where("category", "==", "burgers")
                            .orderBy("star_rating")

db.collection("restaurants").where("city", "==", "San Francisco")
                            .orderBy("star_rating")

db.collection("restaurants").where("category", "==", "burgers")
                            .where("city", "==", "San Francisco")
                            .orderBy("star_rating")

db.collection("restaurants").where("category", "==", "burgers")
                            .where("city", "==" "San Francisco")
                            .where("editors_pick", "==", true )
                            .orderBy("star_rating")

Her sorgu için bir dizin oluşturabilirsiniz:

Toplamak Alanlar dizine eklendi Sorgu kapsamı
restoranlar kategori, yıldızlı_değerlendirmesi Toplamak
restoranlar şehir, yıldızlı_değerlendirmesi Toplamak
restoranlar kategori, şehir, yıldızlı_değerlendirmesi Toplamak
restoranlar kategori, şehir, editors_pick, yıldızlı_değerlendirmesi Toplamak

Daha iyi bir çözüm olarak, Cloud Firestore'un eşitlik maddeleri için dizinleri birleştirme yeteneğinden yararlanarak dizin sayısını azaltabilirsiniz:

Toplamak Alanlar dizine eklendi Sorgu kapsamı
restoranlar kategori, yıldızlı_değerlendirmesi Toplamak
restoranlar şehir, yıldızlı_değerlendirmesi Toplamak
restoranlar editors_pick, yıldızlı_değerlendirmesi Toplamak

Bu dizin kümesi yalnızca daha küçük olmakla kalmaz, aynı zamanda ek bir sorguyu da destekler:

db.collection("restaurants").where("editors_pick", "==", true)
                            .orderBy("star_rating")

Dizine ekleme sınırları

Dizinler için aşağıdaki sınırlar geçerlidir. Tüm kotaların ve limitler için bkz Kotalarını ve Sınırları .

sınır Detaylar
Bir veritabanı için maksimum bileşik dizin sayısı 200
Bir veritabanı için maksimum tek alanlı dizin muafiyeti sayısı 200

Her belge için maksimum dizin girişi sayısı

40.000

Dizin girişlerinin sayısı, bir belge için aşağıdakilerin toplamıdır:

  • Tek alanlı dizin girişlerinin sayısı
  • Bileşik dizin girişlerinin sayısı

Bulut Firestore bir belge ve dizin girişleri içine endeksler bir dizi döner işlediğini görmek için bkz bu endeks giriş sayımı örneği .

Bir dizin girişinin maksimum boyutu

7.5 KiB

Bulut Firestore endeksi giriş boyutunu nasıl hesapladığını görmek için bkz indeks girişi boyutunu .

Bir belgenin dizin girişlerinin boyutlarının maksimum toplamı

8 MiB

Toplam boyut, bir belge için aşağıdakilerin toplamıdır:

  • Bir belgenin tek alanlı dizin girişlerinin boyutunun toplamı
  • Bir belgenin bileşik dizin girişlerinin boyutunun toplamı
  • Dizine alınmış alan değerinin maksimum boyutu

    1500 bayt

    1500 baytın üzerindeki alan değerleri kısaltılır. Kesilmiş alan değerlerini içeren sorgular tutarsız sonuçlar döndürebilir.

    En iyi uygulamaları dizine ekleme

    Çoğu uygulamada, dizinlerinizi yönetmek için otomatik dizin oluşturmaya ve hata mesajı bağlantılarına güvenebilirsiniz. Ancak, aşağıdaki durumlarda tek alanlı muafiyetler eklemek isteyebilirsiniz:

    Durum Açıklama
    Büyük dize alanları

    Sorgulama için kullanmadığınız, genellikle uzun dize değerleri içeren bir dize alanınız varsa, alanı dizine eklemekten muaf tutarak depolama maliyetlerini azaltabilirsiniz.

    Sıralı değerlere sahip belgeler içeren bir koleksiyona yüksek yazma oranları

    Bir koleksiyondaki belgeler arasında zaman damgası gibi sırayla artan veya azalan bir alanı dizine eklerseniz, koleksiyona maksimum yazma hızı saniyede 500 yazma olur. Ardışık değerlere sahip alana dayalı sorgulama yapmazsanız, bu sınırı atlamak için alanı indekslemeden muaf tutabilirsiniz.

    Örneğin, yüksek yazma hızına sahip bir IoT kullanım durumunda, zaman damgası alanına sahip belgeler içeren bir koleksiyon, saniyede 500 yazma sınırına yaklaşabilir.

    Büyük dizi veya harita alanları

    Büyük dizi veya harita alanları, belge başına 40.000 dizin girişi sınırına yaklaşabilir. Büyük bir dizi veya harita alanına dayalı olarak sorgulama yapmıyorsanız, onu indekslemeden muaf tutmalısınız.