Dizinler, veritabanı performansında önemli bir faktördür. Bir kitaptaki konuları sayfa numaralarıyla eşleyen bir kitap dizini gibi, bir veritabanı dizini de bir veritabanındaki öğeleri veritabanındaki konumları ile eşleştirir. Bir veritabanına sorgu gönderdiğinizde veritabanı, istediğiniz öğelerin konumlarını hızlı bir şekilde aramak için bir dizin kullanabilir.
Bu sayfada, Cloud Firestore'un kullandığı iki dizin türü (tek alanlı dizinler ve birleşik dizinler) açıklanmaktadır.
Dizin tanımı ve yapısı
Belirli bir belgedeki alanlar listesinde, her bir alan için karşılık gelen dizin modu ile birlikte bir dizin tanımlanır.
Bir dizin, dizinin tanımında adı geçen her alan için bir giriş içerir. Dizin, dizine dayalı sorgular için olası sonuç olan tüm dokümanları içerir. Bir doküman, yalnızca dizinde kullanılan her alan için dizine eklenmiş bir değere sahip olduğunda dizine eklenir. Dizin tanımı, dokümanda değer ayarlanmamış bir alana işaret ederse bu doküman dizinde görünmez ve dolayısıyla dizine dayalı sorguların sonucu olarak hiçbir zaman döndürülmez.
Bileşik dizin, alan değerlerine göre, dizin tanımında belirtilen sırada sıralanır.
Her sorgunun arkasındaki dizin
Bir sorgu için dizin yoksa çoğu veritabanı, içeriklerini öğe bazında tarar. Bu, veritabanı büyüdükçe daha da yavaş bir işlem olan yavaş bir süreçtir. Cloud Firestore, tüm sorgular için dizinleri kullanarak yüksek sorgu performansını 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. Uygulamanızı kullanıp test ederken Cloud Firestore, uygulamanızın gerektirdiği ek dizinleri belirlemenize ve oluşturmanıza yardımcı olur.
Dizin türleri
Cloud Firestore iki tür dizin kullanır: tek alanlı ve birleşik. Dizine eklenen alan sayısının yanı sıra tek alanlı ve birleşik dizinler bunları yönetme şeklinizde farklılık gösterir.
Tek alanlı dizinler
Tek alanlı dizin, belirli bir alan içeren bir koleksiyondaki tüm dokümanların sıralı eşlemesini depolar. Tek alanlı dizindeki her giriş, bir dokümanın belirli bir alan için değerini ve dokümanın veritabanındaki konumunu kaydeder. Cloud Firestore, birçok temel sorguyu gerçekleştirmek için bu dizinleri kullanır. Veritabanınızın otomatik dizine ekleme ayarlarını ve dizin muafiyetlerini yapılandırarak tek alanlı dizinleri yönetebilirsiniz.
Otomatik dizine ekleme
Varsayılan olarak Cloud Firestore, belgedeki her alan ve haritadaki her alt alan için tek alanlı dizinleri otomatik olarak korur. Cloud Firestore, tek alanlı dizinler için aşağıdaki varsayılan ayarları kullanır:
Cloud Firestore, dizi olmayan ve eşleme olmayan her alan için biri artan, diğeri azalan modda olmak üzere iki koleksiyon kapsamlı tek alanlı dizin tanımlar.
Cloud Firestore, her eşleme alanı için aşağıdakileri oluşturur:
- Dizi olmayan, harita dışı her alt alan için bir koleksiyon kapsamlı artan dizin.
- Dizi olmayan, harita dışı her alt alan için bir koleksiyon kapsamı azalan dizin.
- Her dizi alt alanı için bir koleksiyon kapsamı dizi-içeren dizin.
- Cloud Firestore, her harita alt alanını yinelemeli olarak dizine ekler.
Cloud Firestore, belgedeki her dizi alanı için koleksiyon kapsamlı bir dizi içeren dizin oluşturur ve bu dizinin bakımını yapar.
Toplama grubu kapsamına sahip tek alanlı dizinler varsayılan olarak korunmaz.
Tek alanlı dizin muafiyetleri
Tek alanlı dizin muafiyeti oluşturarak bir alanı otomatik dizine ekleme ayarlarınızdan muaf tutabilirsiniz. Dizine ekleme muafiyeti, veritabanı genelindeki otomatik dizin ayarlarını geçersiz kılar. Muafiyet, otomatik dizine ekleme ayarlarınızın otomatik dizine eklemenin başka şekilde etkinleştireceği tek alanlı bir dizini devre dışı bırakacağı veya devre dışı bırakacağı tek alanlı bir dizini etkinleştirebilir. Muafiyetlerin faydalı olabileceği durumlar için dizine eklemeyle ilgili en iyi uygulamaları inceleyin.
Bir koleksiyon grubundaki tüm alanlarda koleksiyon düzeyinde dizin muafiyetleri eklemek için *
alan yolu değerini kullanın. Örneğin, comments
koleksiyon grubu için alan yolunu comments
koleksiyon grubundaki tüm alanlarla eşleşecek şekilde *
olarak ayarlayın ve koleksiyon grubu altındaki tüm alanların dizine eklenmesini devre dışı bırakın. Daha sonra, yalnızca sorgularınız için gerekli olan alanları dizine eklemek üzere muafiyetler ekleyebilirsiniz. Dizine eklenen alanların sayısını azaltmak, depolama maliyetlerini azaltır ve yazma performansını artırabilir.
Bir eşleme alanı için tek alanlı dizin muafiyeti oluşturursanız haritanın alt alanları bu ayarları devralır. Bununla birlikte, belirli alt alanlar için tek alanlı dizin muafiyetleri tanımlayabilirsiniz. Bir alt alan için muafiyeti silerseniz alt alan, varsa üst alanının muafiyet ayarlarını veya üst muafiyeti yoksa veritabanı genelindeki ayarları devralır.
Tek alanlı dizin muafiyetleri oluşturmak ve yönetmek için Cloud Firestore'da Dizinleri Yönetme bölümüne bakın.
Bileşik dizinler
Bileşik dizin, dizine eklenecek alanların sıralı listesine göre bir koleksiyondaki tüm dokümanların sıralı eşlemesini depolar.
Cloud Firestore, tek alanlı dizinler tarafından desteklenmeyen sorguları desteklemek için bileşik dizinler kullanır.
Cloud Firestore, olası çok sayıda alan kombinasyonundan dolayı tek alanlı dizinler için yaptığı gibi otomatik olarak bileşik dizinler oluşturmaz. Bunun yerine Cloud Firestore, uygulamanızı geliştirirken gerekli birleşik dizinleri tanımlamanıza ve oluşturmanıza yardımcı olur.
Bir dizin tarafından desteklenmeyen bir sorguyu denediğinizde Cloud Firestore, eksik dizini oluşturmak için izleyebileceğiniz bağlantının yer aldığı bir hata mesajı döndürür.
Ayrıca, konsolu veya Firebase KSA'yı kullanarak bileşik dizinleri manuel olarak tanımlayabilir ve yönetebilirsiniz. Bileşik dizinler oluşturma ve yönetme hakkında daha fazla bilgi için Dizinleri Yönetme bölümünü inceleyin.
Dizin modları ve sorgu kapsamları
Tek alanlı ve birleşik dizinleri farklı şekilde yapılandırırsınız ancak her ikisi için de dizinleriniz için dizin modlarını ve sorgu kapsamlarını yapılandırmanız gerekir.
Dizin modları
Bir dizin tanımladığınızda, dizine eklenen her alan için bir dizin modu seçersiniz. Her alanın dizin modu, o alanda belirli sorgu deyimlerini destekler. Aşağıdaki dizin modları arasından seçim yapabilirsiniz:
Dizin modu | Açıklama |
---|---|
Artan | Alanda < , <= , == , >= , > , != , in ve not-in sorgu deyimlerini ve bu alan değerine göre sonuçları artan düzende sıralamayı destekler. |
Azalan | Alanda < , <= , == , >= , > , != , in ve not-in sorgu deyimlerini destekler ve sonuçları bu alan değerine göre azalan düzende sıralamayı destekler. |
Dizi-içerir | Alanda array-contains ve array-contains-any sorgu ifadelerini destekler. |
Vektör | Alanda FindNearest sorgu deyimlerini destekler. |
Sorgu kapsamları
Her dizin, bir koleksiyon veya koleksiyon grubuna ayarlanır. Bu, dizinin sorgu kapsamı olarak bilinir:
- Koleksiyon kapsamı
- Cloud Firestore varsayılan olarak koleksiyon kapsamıyla dizinler oluşturur. Bu dizinler, tek bir koleksiyondan sonuç döndüren sorguları destekler.
- Koleksiyon grubu kapsamı
- Koleksiyon grubu, aynı koleksiyon kimliğine sahip tüm koleksiyonları içerir. Bir koleksiyon grubundan filtrelenmiş veya sıralı sonuçlar döndüren bir koleksiyon grubu sorgusu çalıştırmak için koleksiyon grubu kapsamına sahip karşılık gelen bir dizin oluşturmanız gerekir.
Varsayılan sıralama ve __name__
alanı
Dizinler, belgeleri her alan için belirtilen dizin modlarına (artan veya azalan) göre sıralamanın yanı sıra her belgenin __name__
alanına göre son bir sıralama uygular. __name__
alanının değeri, tam belge yolu olarak ayarlanır. Bu, sonuç kümesindeki aynı alan değerlerine sahip dokümanların belge yoluna göre sıralandığı anlamına gelir.
Varsayılan olarak __name__
alanı, dizin tanımındaki son sıralı alanın yönünde sıralanır. Örnek:
Toplama | Dizine eklenen alanlar | Sorgu kapsamı |
---|---|---|
şehirler | __name__ |
adı, Toplama |
şehirler | __name__ |
eyalet, Toplama |
şehirler | __name__ |
ülke, nüfus, Toplama |
Sonuçları varsayılan olmayan __name__
yönüne göre sıralamak için bu dizini oluşturmanız gerekir.
Mükemmel Dizin
Bir sorgu için, sorgunun en verimli şekilde yürütülmesini sağlayan mükemmel dizin, sırasıyla aşağıdaki özelliklerde tanımlanır:
- Eşitlik filtrelerinde kullanılan alanlar
- Sıralama siparişlerinde kullanılan alanlar
- Aralık ve eşitsizlik filtrelerinde kullanılan (sıralama siparişlerine halihazırda dahil olmayanlar) alanlar
- Toplamalarda kullanılan alanlar (sıralama siparişleri ile aralık ve eşitsizlik filtrelerine halihazırda dahil olmayanlar)
Firestore, sorgulara ait sonuçları şu şekilde hesaplar:
- Sorgu koleksiyonuna, filtre özelliklerine, filtre operatörlerine ve sıralama siparişlerine karşılık gelen dizini tanımlar
- Sorgunun eşitlik filtrelerini ve alana göre ilk sırada aralık ve eşitsizlik filtrelerini kullanarak taramanın başlatılacağı dizin konumunu tanımlar
- Dizini taramaya başlar ve tüm filtrelere uygun olan her doküman, aşağıdaki görevlere uyana kadar döndürülür:
- filtre koşullarını karşılamayan bir dokümanla karşılaştığında ve sonraki tüm dokümanların filtre koşullarını hiçbir zaman tam olarak karşılamayacağını onayladığında veya
- dizinin sonuna ulaştığında veya
- sorgu tarafından istenen maksimum sayıda sonuç topladı
Dizine ekleme örneği
Cloud Firestore, sizin için otomatik olarak tek alanlı dizinler oluşturarak uygulamanızın en temel veritabanı sorgularını hızlı bir şekilde desteklemesini sağlar.
Tek alanlı dizinler, alan değerlerine ve <
, <=
, ==
, >=
, >
ve in
karşılaştırıcılarına dayalı olarak basit sorgular gerçekleştirmenizi sağlar. Dizi alanlarında array-contains
ve array-contains-any
sorguları gerçekleştirmenize olanak tanır.
Örnek vermek için aşağıdaki örnekleri dizin oluşturma açısından inceleyin. Aşağıdaki snippet bir cities
koleksiyonunda birkaç city
dokümanı oluşturur ve her doküman için name
, state
, country
, capital
, population
ve tags
alanlarını ayarlar:
Web
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 dizine ekleme ayarları varsa Cloud Firestore, dizi olmayan her alan için artan tek alanlı bir dizini, dizi olmayan alan başına bir azalan tek alanlı dizini ve dizi alanı için bir dizi içeren tek alanlı dizini günceller. Aşağıdaki tabloda yer alan her satır, tek alanlı dizindeki bir girişi temsil eder:
Toplama | Alana dizine eklendi | Sorgu kapsamı |
---|---|---|
şehirler | adı | Toplama |
şehirler | eyalet | Toplama |
şehirler | ülke | Toplama |
şehirler | büyük harf | Toplama |
şehirler | nüfus | Toplama |
şehirler | adı | Toplama |
şehirler | eyalet | Toplama |
şehirler | ülke | Toplama |
şehirler | büyük harf | Toplama |
şehirler | nüfus | Toplama |
şehirler | array-contains bölge |
Toplama |
Tek alanlı dizinler tarafından desteklenen sorgular
Otomatik olarak oluşturulan bu tek alanlı dizinleri kullanarak aşağıdakiler gibi basit sorgular çalıştırabilirsiniz:
Web
const stateQuery = citiesRef.where("state", "==", "CA"); const populationQuery = citiesRef.where("population", "<", 100000); const nameQuery = citiesRef.where("name", ">=", "San Francisco");
Ayrıca in
ve bileşik eşitlik (==
) sorguları da oluşturabilirsiniz:
Web
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)
Aralık karşılaştırması (<
, <=
, >
veya >=
) kullanan bir bileşik sorgu çalıştırmanız veya farklı bir alana göre sıralama yapmanız gerekiyorsa bu sorgu için birleşik dizin oluşturmanız gerekir.
array-contains
dizini, regions
dizi alanını sorgulamanızı sağlar:
Web
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 desteklenmeyen bileşik sorguları desteklemek için bileşik dizinler kullanır. Örneğin, aşağıdaki sorgular için bileşik bir dizine ihtiyacınız olur:
Web
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 için aşağıdaki bileşik dizin gereklidir. Sorgu, country
alanı için eşitlik (==
veya in
) kullandığından bu alan için artan veya azalan dizin modu kullanabilirsiniz. Varsayılan olarak eşitsizlik ifadeleri, eşitsizlik yan tümcesindeki alana göre artan bir sıralama düzeni uygular.
Toplama | Dizine eklenen alanlar | Sorgu kapsamı |
---|---|---|
şehirler | (veya ) ülke, nüfus | Toplama |
Aynı sorguları azalan sıralama düzeniyle çalıştırmak isterseniz population
için azalan yönde ek bir birleşik dizine ihtiyacınız vardır:
Web
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")
Toplama | Dizine eklenen alanlar | Sorgu kapsamı |
---|---|---|
şehirler | ülke, nüfus | Toplama |
şehirler | ülke, nüfus | Toplama |
Ayrıca, array-contains
veya array-contains-any
sorgusunu ek ifadelerle birleştirmek için bileşik dizin oluşturmanız gerekir.
Web
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)
Toplama | Dizine eklenen alanlar | Sorgu kapsamı |
---|---|---|
şehirler | array-contains etiketleri, | (veya ) büyük harfToplama |
Koleksiyon grubu dizinleri tarafından desteklenen sorgular
Koleksiyon grubu kapsamına sahip bir dizin göstermek için city
belgelerinden bazılarına bir landmarks
alt koleksiyonu eklediğinizi düşünün:
Web
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" });
Aşağıdaki tek alanlı dizini, toplama kapsamıyla kullanarak tek bir şehrin landmarks
koleksiyonunu category
alanına göre sorgulayabilirsiniz:
Toplama | Dizine eklenen alanlar | Sorgu kapsamı |
---|---|---|
önemli noktalar | (veya ) kategorisi | Toplama |
Web
citiesRef.doc("SF").collection("landmarks").where("category", "==", "park") citiesRef.doc("SF").collection("landmarks").where("category", "in", ["park", "museum"])
Şimdi, tüm şehirlerdeki önemli noktalara sorgulama yapmak istediğinizi varsayalım.
Bu sorguyu tüm landmarks
koleksiyonlarından oluşan koleksiyon grubunda çalıştırmak için koleksiyon grubu kapsamına sahip bir landmarks
tek alanlı dizini etkinleştirmeniz gerekir:
Toplama | Dizine eklenen alanlar | Sorgu kapsamı |
---|---|---|
önemli noktalar | (veya ) kategorisi | Koleksiyon grubu |
Bu dizin etkinleştirildiğinde landmarks
koleksiyon grubunu sorgulayabilirsiniz:
Web
var landmarksGroupRef = db.collectionGroup("landmarks"); landmarksGroupRef.where("category", "==", "park") landmarksGroupRef.where("category", "in", ["park", "museum"])
Filtrelenmiş veya sıralı sonuçlar döndüren bir koleksiyon grubu sorgusu çalıştırmak için koleksiyon grubu kapsamına sahip karşılık gelen bir tek alan veya birleşik dizin etkinleştirmeniz gerekir. Sonuçları filtrelemeyen veya sıralamayan koleksiyon grubu sorguları için ek dizin tanımı gerekmez.
Örneğin, ek bir dizin etkinleştirmeden aşağıdaki koleksiyon grubu sorgusunu çalıştırabilirsiniz:
Web
db.collectionGroup("landmarks").get()
Dizin girişleri
Bir belgenin dizin girişlerinin sayısı, projenizin yapılandırılmış dizinleri ve belge yapısı tarafından belirlenir. Dizin girişleri, dizin girişi sayısı sınırına dahil edilir.
Aşağıdaki örnekte bir dokümanın dizin girişleri gösterilmektedir.
Doküman
/cities/SF
city_name : "San Francisco"
temperatures : {summer: 67, winter: 55}
neighborhoods : ["Mission", "Downtown", "Marina"]
Tek Alanlı dizinler
- şehir_adı ASC
- şehir_adı DESC
- sıcaklıklar.yaz ASC
- sıcaklıklar.summer DESC
- sıcaklıklar.winter ASC
- sıcaklıklar.winter DESC
- Mahalleler Dizisi İçerir (ASC ve DESC)
Bileşik dizinler
- şehir_adı ASC, mahalleler ARRAY
- şehir_adı DESC, mahalleler ARRAY
Dizin girişleri
Bu dizine ekleme yapılandırması, doküman için aşağıdaki 18 dizin girişiyle sonuçlanır:
Dizin | Dizine eklenmiş veriler |
---|---|
Tek alanlı dizin girişleri | |
şehir_adı ASC | City_name: "İstanbul" |
şehir_adı DESC | City_name: "İstanbul" |
sıcaklıklar.yaz ASC | sıcaklıklar.yaz: 67 |
sıcaklıklar.summer DESC | sıcaklıklar.yaz: 67 |
sıcaklıklar.winter ASC | sıcaklıklar.winter: 55 |
sıcaklıklar.winter DESC | sıcaklıklar.winter: 55 |
mahalle dizisinde ASC içerir | muhitler: "Misyon" |
mahalleler Dizisi Şunu İçerir: DESC | muhitler: "Misyon" |
mahalle dizisinde ASC içerir | mahalleler: "Şehir merkezi" |
mahalleler Dizisi Şunu İçerir: DESC | mahalleler: "Şehir merkezi" |
mahalle dizisinde ASC içerir | mahalleler: "İstanbul" |
mahalleler Dizisi Şunu İçerir: DESC | mahalleler: "İstanbul" |
Bileşik dizin girişleri | |
şehir_adı ASC, mahalleler ARRAY | City_name: "İstanbul", mahalleler: "İstanbul" |
şehir_adı ASC, mahalleler ARRAY | City_name: "İstanbul", mahalleler: "Şehir Merkezi" |
şehir_adı ASC, mahalleler ARRAY | City_name: "İstanbul", mahalleler: "İstanbul" |
şehir_adı DESC, mahalleler ARRAY | City_name: "İstanbul", mahalleler: "İstanbul" |
şehir_adı DESC, mahalleler ARRAY | City_name: "İstanbul", mahalleler: "Şehir Merkezi" |
şehir_adı DESC, mahalleler ARRAY | City_name: "İstanbul", mahalleler: "İstanbul" |
Dizinler ve fiyatlandırma
Dizinler, uygulamanızın depolama maliyetlerine katkıda bulunur. Dizinler için depolama boyutunun nasıl hesaplandığı hakkında daha fazla bilgi edinmek için Dizin girişi boyutu bölümüne bakın.
Dizin birleştirmeden yararlanma
Cloud Firestore her sorgu için bir dizin kullansa da sorgu başına bir dizin gerektirmez. Cloud Firestore, birden fazla eşitlik (==
) deyimi ve isteğe bağlı olarak orderBy
ifadesini içeren sorgularda mevcut dizinleri yeniden kullanabilir. Cloud Firestore, basit eşitlik filtreleri için dizinleri birleştirerek daha büyük eşitlik sorguları için gereken birleşik dizinleri oluşturabilir.
Dizin birleştirmeden faydalanabileceğiniz durumları belirleyerek dizine ekleme maliyetlerini azaltabilirsiniz. Örneğin, bir restoran derecelendirme uygulaması için
restaurants
koleksiyonunu düşünün:
restoran
hamburger
name : "Burger Thyme"
category : "burgers"
city : "San Francisco"
editors_pick : true
star_rating : 4
Şimdi, bu uygulamanın aşağıdaki gibi sorgular kullandığını düşünün. Uygulamanın category
, city
ve editors_pick
için eşitlik ifadelerini bir arada kullanırken her zaman artan star_rating
düzenine göre sıralama yaptığına dikkat edin:
Web
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:
Toplama | Dizine eklenen alanlar | Sorgu kapsamı |
---|---|---|
restoranlar | kategorisi, star_rating | Toplama |
restoranlar | şehir, yıldızlı değerlendirme | Toplama |
restoranlar | kategorisi, şehir, star_rating | Toplama |
restoranlar | kategorisi, şehir, editor_pick, star_rating | Toplama |
Daha iyi bir çözüm olarak, Cloud Firestore'un eşitlik ifadeleri için dizinleri birleştirme özelliğinden yararlanarak dizin sayısını azaltabilirsiniz:
Toplama | Dizine eklenen alanlar | Sorgu kapsamı |
---|---|---|
restoranlar | kategorisi, star_rating | Toplama |
restoranlar | şehir, yıldızlı değerlendirme | Toplama |
restoranlar | editörleri_seç, yıldız_derecelendirmesi | Toplama |
Bu dizin grubu hem daha küçüktür hem de ek bir sorguyu destekler:
Web
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 ve sınırlar için Kotalar ve Sınırlar bölümüne bakın.
Sınır | Ayrıntılar |
---|---|
Bir veritabanı için maksimum birleşik dizin sayısı |
|
Bir veritabanı için maksimum tek alanlı yapılandırma sayısı |
Bir alan düzeyinde yapılandırma, aynı alan için birden fazla yapılandırma içerebilir. Örneğin, tek bir alanda dizine ekleme muafiyeti ve aynı alandaki bir TTL politikası, sınıra dahil edilen tek bir alan yapılandırması olarak sayılır. |
Her belge için maksimum dizin girişi sayısı |
40.000 Belgelerde dizin girişlerinin sayısı, aşağıdakilerin toplamına eşittir:
Cloud Firestore'un bir belgeyi ve dizin grubunu nasıl dizin girişine dönüştürdüğünü görmek için dizin girişi sayısıyla ilgili bu örneğe göz atın. |
Bileşik dizindeki maksimum alan sayısı | 100 |
Dizin girişinin maksimum boyutu |
7,5 KiB Cloud Firestore'un dizin girişi boyutunu nasıl hesapladığını öğrenmek için dizin girişi boyutu bölümünü inceleyin. |
Bir belgenin dizin girişlerinin maksimum toplam boyutu |
8 MiB Belgelerdeki toplam boyut, aşağıdakilerin toplamına eşittir: |
Dizine eklenen alan değerinin maksimum boyutu |
1.500 bayt Boyutu 1.500 baytı aşan alan değerleri kısaltılır. Kısaltılmış alan değerleri içeren sorgular tutarsız sonuçlar verebilir. |
Dizine eklemeyle ilgili en iyi uygulamalar
Çoğu uygulamada, dizinlerinizi yönetmek için otomatik dizine ekleme özelliğini ve hata mesajı bağlantılarını kullanabilirsiniz. Ancak, aşağıdaki durumlarda tek alanlı muafiyetler eklemek isteyebilirsiniz:
Durum | Açıklama |
---|---|
Geniş dize alanları | Genellikle sorgulamada kullanmadığınız uzun dize değerleri içeren bir dize alanınız varsa bu alanı dizine eklenmekten muaf tutarak depolama maliyetlerini azaltabilirsiniz. |
Sıralı değerleri olan belgeler içeren bir koleksiyona yüksek yazma hızları | Zaman damgası gibi, koleksiyondaki belgeler arasında sırayla artan veya azalan bir alanı dizine eklerseniz koleksiyondaki maksimum yazma hızı saniyede 500 yazma işlemi olur. Sıralı değerleri olan alana göre sorgulama yapmıyorsanız bu sınırı atlamak için alanı dizine eklenmekten muaf tutabilirsiniz. Örneğin, yazma hızı yüksek olan bir IoT kullanım alanında, zaman damgası alanı olan belgeler içeren bir koleksiyon, saniyede 500 yazma sınırına yaklaşabilir. |
TTL alanları |
TTL (Geçerlilik süresi) politikalarını kullanıyorsanız TTL alanının bir zaman damgası olması gerektiğini unutmayın. TTL alanlarında dizine ekleme varsayılan olarak etkindir ve daha yüksek trafik oranlarında performansı etkileyebilir. En iyi uygulama olarak, TTL alanlarınız için tek alanlı muafiyetler ekleyin. |
Büyük dizi veya eşleme alanları | Büyük dizi veya eşleme alanları,belge başına 40.000 dizin girişi sınırına yaklaşabilir. Geniş bir diziye veya eşleme alanına dayalı sorgulama yapmıyorsanız dizine ekleme işleminden muaf tutmanız gerekir. |
Birden çok alanda aralık ve eşitsizlik operatörleri içeren sorgular kullanıyorsanız Cloud Firestore sorgularının performansını ve maliyetini optimize etmek için dikkate almanız gereken dizine eklemeyle ilgili dikkat edilmesi gereken noktaları inceleyin
Dizine ekleme sorunlarının (dizin dağılması, INVALID_ARGUMENT
hataları) nasıl çözüleceğine ilişkin daha fazla bilgi için sorun giderme sayfasına göz atın.