Dizinler, veritabanı performansında önemli bir faktördür. Bir kitaptaki konuları sayfa numaralarıyla eşleyen kitap dizinine benzer şekilde, bir veritabanı dizini de veritabanındaki öğeleri veritabanındaki konumlarıyla eşler. Bir veritabanını sorguladığınızda veritabanı, istediğiniz öğelerin konumlarını hızlıca belirlemek için bir dizin kullanabilir.
Bu sayfada, Cloud Firestore tarafından kullanılan iki dizin türü (tek alanlı dizinler ve birleşik dizinler) açıklanmaktadır.
Dizin tanımı ve yapısı
Dizin, belirli bir belgenin alan listesinde tanımlanır. Her alan için karşılık gelen bir dizin modu vardır.
Bir dizin, dizin tanımında belirtilen her alan için bir giriş içerir. Dizin, dizine dayalı sorguların olası sonuçları olan tüm belgeleri içerir. Bir belge, yalnızca dizinde kullanılan her alan için dizine eklenmiş bir değer ayarlanmışsa dizine dahil edilir. Dizin tanımı, belgenin değer ayarlamadığı bir alanı referans alıyorsa bu belge dizinde görünmez. Bu durumda, belge hiçbir zaman dizine dayalı sorgunun sonucu olarak döndürülmez.
Birleşik dizin, dizin tanımında belirtilen sırayla alan değerlerine göre sıralanır.
Her sorgunun arkasında bir dizin
Bir sorgu için dizin yoksa çoğu veritabanı, içeriklerini öğe öğe tarar. Bu yavaş süreç, veritabanı büyüdükçe daha da yavaşlar. Cloud Firestore, tüm sorgular için dizinleri kullanarak yüksek sorgu performansı sağlar. Bu nedenle, sorgu performansı, sonuç kümesinin boyutuna bağlıdır ve veritabanındaki öğe sayısına bağlı değildir.
Daha az dizin yönetimi, daha fazla uygulama geliştirme
Cloud Firestore, dizin yönetimi 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 ihtiyaç duyduğu 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. Tek alanlı ve birleşik dizinler, dizine eklenen alanların sayısının yanı sıra yönetilme şekilleri bakımından da farklılık gösterir.
Tek alanlı dizinler
Tek alanlı dizin, belirli bir alanı içeren bir koleksiyondaki tüm belgelerin sıralanmış bir eşlemesini depolar. Tek alanlı dizindeki her giriş, bir belgenin belirli bir alandaki değerini ve belgenin veritabanındaki konumunu kaydeder. Cloud Firestore, birçok temel sorguyu gerçekleştirmek için bu dizinleri kullanır. Tek alanlı dizinleri, veritabanınızın otomatik dizin oluşturma ayarlarını ve dizin muafiyetlerini yapılandırarak yönetirsiniz.
Otomatik dizine ekleme
Varsayılan olarak Cloud Firestore, bir belgedeki her alan ve bir 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 harita olmayan her alan için biri artan, diğeri azalan modda olmak üzere iki koleksiyon kapsamlı tek alan dizini tanımlar.
Her harita alanı için Cloud Firestore aşağıdakileri oluşturur:
- Dizi olmayan ve harita olmayan her alt alan için bir koleksiyon kapsamlı artan dizin.
- Dizi olmayan, harita olmayan her alt alan için bir koleksiyon kapsamlı azalan dizin.
- Her dizi alt alanı için bir koleksiyon kapsamlı array-contains dizini.
- Cloud Firestore her harita alt alanını yinelemeli olarak dizine ekler.
Cloud Firestore, bir belgedeki her dizi alanı için koleksiyon kapsamlı bir dizi içerir dizini oluşturur ve bu dizini korur.
Koleksiyon 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. Dizin oluşturma muafiyeti, veritabanı genelindeki otomatik dizin ayarlarını geçersiz kılar. Muafiyet, otomatik dizine ekleme ayarlarınızın devre dışı bırakacağı tek alanlı bir dizini etkinleştirebilir veya otomatik dizine eklemenin etkinleştireceği tek alanlı bir dizini devre dışı bırakabilir. Muafiyetlerin yararlı olabileceği durumlar için dizin oluşturmayla ilgili en iyi uygulamalar başlıklı makaleyi inceleyin.
Bir koleksiyon grubundaki tüm alanlara koleksiyon düzeyinde dizin muafiyetleri eklemek için *
alan yolu değerini kullanın. Örneğin, comments
koleksiyon grubu için alan yolunu *
olarak ayarlayarak comments
koleksiyon grubundaki tüm alanlarla eşleşmesini sağlayın ve koleksiyon grubu altındaki tüm alanların dizine eklenmesini devre dışı bırakın. Ardından, yalnızca sorgularınız için gerekli alanları dizine eklemek üzere muafiyetler ekleyebilirsiniz. Dizin oluşturulan alanların sayısını azaltmak depolama maliyetlerini düşürür ve yazma performansını artırabilir.
Bir harita alanı için tek alan dizini 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 muafiyeti silerseniz alt alan, varsa üst alanının muafiyet ayarlarını veya üst alan muafiyeti yoksa veritabanı genelindeki ayarları devralır.
Tek alanlı dizin muafiyetleri oluşturma ve yönetme hakkında bilgi edinmek için Dizinleri yönetme başlıklı makaleyi inceleyin.
Birleşik dizinler
Bileşik dizin, dizine eklenecek sıralı alan listesine göre bir koleksiyondaki tüm belgelerin sıralanmış eşlemesini depolar.
Cloud Firestore, tek alanlı dizinler tarafından desteklenmeyen sorguları desteklemek için bileşik dizinler kullanır.
Cloud Firestore, olası alan kombinasyonlarının çok fazla olması nedeniyle tek alanlı dizinlerde olduğu gibi otomatik olarak bileşik dizinler oluşturmaz. Bunun yerine, Cloud Firestore, uygulamanızı oluştururken gerekli bileşik dizinleri belirlemenize ve oluşturmanıza yardımcı olur.
Bir dizin tarafından desteklenmeyen bir sorgu denediğinizde Cloud Firestore, eksik dizini oluşturmak için izleyebileceğiniz bir bağlantı içeren hata mesajı döndürür.
Ayrıca, konsolu veya Firebase CLI'yı kullanarak birleşik dizinleri manuel olarak tanımlayabilir ve yönetebilirsiniz. Bileşik dizin oluşturma ve yönetme hakkında daha fazla bilgi için Dizinleri yönetme başlıklı makaleyi inceleyin.
Dizin modları ve sorgu kapsamları
Tek alanlı ve bileşik dizinleri farklı şekilde yapılandırırsınız ancak her ikisi için de dizinlerinizin 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 alandaki belirli sorgu ifadelerini destekler. Aşağıdaki dizin modlarından birini seçebilirsiniz:
Dizin modu | Açıklama |
---|---|
Artan | Alanın < , <= , == , >= , > , != , in ve not-in sorgu ifadelerini destekler ve sonuçların bu alan değerine göre artan sırada sıralanmasını sağlar. |
Azalan | Alanın < , <= , == , >= , > , != , in ve not-in sorgu ifadelerini destekler ve sonuçların bu alan değerine göre azalan düzende sıralanmasını sağlar. |
Array‑contains | Alanda array-contains ve array-contains-any sorgu ifadelerini destekler. |
Vector | Alanda FindNearest sorgu ifadelerini destekler. |
Sorgu kapsamları
Her dizin, bir koleksiyon veya koleksiyon grubuyla sınırlandı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ı
- Koleksiyon grubu, aynı koleksiyon kimliğine sahip tüm koleksiyonları içerir. Bir koleksiyon grubundan filtrelenmiş veya sıralanmış sonuçlar döndüren bir koleksiyon grubu sorgusu çalıştırmak için koleksiyon grubu kapsamına sahip 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 doküman yolu olarak ayarlanır. Bu, sonuç kümesindeki aynı alan değerlerine sahip belgelerin belge yoluna göre sıralandığı anlamına gelir.
Varsayılan olarak __name__
alanı, dizin tanımında son sıralanan alanla aynı yönde sıralanır. Örneğin:
Toplama | Dizine eklenen alanlar | Sorgu kapsamı |
---|---|---|
şehirler | __name__ |
name, Toplama |
şehirler | __name__ |
eyaleti, Toplama |
şehirler | __name__ |
ülke, nüfus, Toplama |
Sonuçları varsayılan olmayan __name__
yöne göre sıralamak için bu dizini oluşturmanız gerekir.
Dizin özellikleri
Sorgunun en verimli şekilde yürütülmesine olanak tanıyan bir dizin aşağıdaki özelliklerle tanımlanır:
- Eşitlik filtrelerinde kullanılan alanlar
- Sıralama düzenlerinde kullanılan alanlar
- Aralık ve eşitsizlik filtrelerinde kullanılan alanlar (sıralama düzenlerine zaten dahil edilmemiş olanlar)
- Toplamalarda kullanılan alanlar (sıralama düzenlerine, aralık ve eşitsizlik filtrelerine dahil olmayanlar)
Cloud Firestore, sorguların sonuçlarını aşağıdaki gibi hesaplar:
- Sorgunun koleksiyonuna, filtre özelliklerine, filtre operatörlerine ve sıralama düzenlerine karşılık gelen dizini tanımlar.
- Taramanın başlayacağı dizin konumunu tanımlar. Başlangıç konumu, sorgunun eşitlik filtreleriyle başlar ve ilk
orderBy
alanındaki aralık ve eşitsizlik filtreleriyle biter. - Tarama işlemi aşağıdakilerden birini yapana kadar dizini taramaya başlar ve tüm filtreleri karşılayan her belgeyi döndürür:
- Filtre koşullarını karşılamayan bir belgeyle karşılaşır ve sonraki belgelerin hiçbir zaman filtre koşullarını tam olarak karşılamayacağını onaylar.
- Dizinin sonuna ulaşır.
- Sorgu tarafından istenen maksimum sonuç sayısını toplar.
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ı basit sorgular yapmanıza olanak tanır. Dizi alanları için array-contains
ve array-contains-any
sorguları yapabilirsiniz.
Örnek olarak, aşağıdaki örnekleri dizin oluşturma açısından inceleyin. Aşağıdaki snippet, 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ının kullanıldığını varsayarsak Cloud Firestore, dizi olmayan her alan için artan düzende tek alanlı bir dizin, dizi olmayan her alan için azalan düzende tek alanlı bir dizin ve dizi alanı için dizi içeren tek alanlı bir dizin günceller. Aşağıdaki tablodaki her satır, tek alanlı bir dizindeki bir girişi temsil eder:
Toplama | Dizine eklenen alan | 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ı dizinlerin desteklediği sorgular
Bu otomatik olarak oluşturulan tek alanlı dizinleri kullanarak aşağıdaki 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 ya da farklı bir alana göre sıralama yapmanız gerekiyorsa bu sorgu için bir bileşik dizin oluşturmanız gerekir.
array-contains
dizini, regions
dizi alanını sorgulamanıza olanak tanır:
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 dizinlerin desteklediği 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 dizine ihtiyacınız vardır:
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 birleşik dizin gerekir. 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 koşulları, eşitsizlik koşulundaki alana göre artan 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 için population
'da azalan yönde ek bir bileş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 |
cities | country, population | Toplama |
Dizin birleştirme nedeniyle performans kaybını önlemek için array-contains
veya array-contains-any
sorgusunu ek maddelerle birleştiren bir bileşik dizin oluşturmanızı öneririz:
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 kapsamlı bir dizini göstermek için city
dokümanlarından bazılarına landmarks
alt koleksiyonu ekleyin:
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" });
Koleksiyon kapsamlı aşağıdaki tek alanlı dizini kullanarak landmarks
koleksiyonunda category
alanına göre tek bir şehri 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"])
Örneğin, tüm şehirlerdeki önemli yerleri sorgulamak istiyorsanız bu sorguyu tüm landmarks
koleksiyonlarından oluşan koleksiyon grubunda çalıştırırsınız. Ayrıca landmarks
koleksiyon grubu kapsamlı tek alanlı bir dizini de 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ıralanmış sonuçlar döndüren bir koleksiyon grubu sorgusu çalıştırmak için koleksiyon grubu kapsamına sahip ilgili bir tek alanlı veya bileşik dizini etkinleştirmeniz gerekir. Ancak sonuçları filtrelemeyen veya sıralamayan koleksiyon grubu sorguları için ek dizin tanımları 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
Projenizin yapılandırılmış dizinleri ve bir belgenin yapısı, belgedeki dizin girişlerinin sayısını belirler. Dizin girişleri, dizin girişi sayısı sınırına dahil edilir.
Aşağıdaki örnekte bir belgenin 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
- city_name ASC
- city_name DESC
- temperatures.summer ASC
- temperatures.summer DESC
- temperatures.winter ASC
- temperatures.winter DESC
- Array Contains (ASC ve DESC)
Birleşik dizinler
- city_name ASC, neighborhoods ARRAY
- city_name DESC, neighborhoods ARRAY
Dizin girişleri
Bu dizine ekleme yapılandırması, belge için aşağıdaki dizin girişleriyle sonuçlanır:
Dizin | Dizine eklenmiş veriler |
---|---|
Tek alanlı dizin girişleri | |
city_name ASC | city_name: "San Francisco" |
city_name DESC | city_name: "San Francisco" |
temperatures.summer ASC | temperatures.summer: 67 |
temperatures.summer DESC | temperatures.summer: 67 |
temperatures.winter ASC | temperatures.winter: 55 |
temperatures.winter DESC | temperatures.winter: 55 |
neighborhoods Array Contains ASC | neighborhoods: "Mission" |
neighborhoods Array Contains DESC | neighborhoods: "Mission" |
neighborhoods Array Contains ASC | neighborhoods: "Downtown" |
neighborhoods Array Contains DESC | neighborhoods: "Downtown" |
neighborhoods Array Contains ASC | neighborhoods: "Marina" |
neighborhoods Array Contains DESC | neighborhoods: "Marina" |
Birleşik dizin girişleri | |
city_name ASC, neighborhoods ARRAY | city_name: "San Francisco", neighborhoods: "Mission" |
city_name ASC, neighborhoods ARRAY | city_name: "San Francisco", neighborhoods: "Downtown" |
city_name ASC, neighborhoods ARRAY | city_name: "San Francisco", neighborhoods: "Marina" |
city_name DESC, neighborhoods ARRAY | city_name: "San Francisco", neighborhoods: "Mission" |
city_name DESC, neighborhoods ARRAY | city_name: "San Francisco", neighborhoods: "Downtown" |
city_name DESC, neighborhoods ARRAY | city_name: "San Francisco", neighborhoods: "Marina" |
Dizinler ve fiyatlandırma
Dizinler, uygulamanızın depolama maliyetlerine katkıda bulunur. Dizinlerin depolama alanı boyutunun nasıl hesaplanacağı hakkında daha fazla bilgi için Dizin girişi boyutu bölümüne bakın.
Dizin birleştirme özelliğini kullanma
Cloud Firestore her sorgu için bir dizin kullansa da sorgu başına bir dizin kullanılması zorunlu değildir. Birden fazla eşitlik (==
) koşulu ve isteğe bağlı olarak bir orderBy
koşulu içeren sorgular için Cloud Firestore, mevcut dizinleri yeniden kullanabilir. Cloud Firestore, daha büyük eşitlik sorguları için gereken birleşik dizinleri oluşturmak üzere basit eşitlik filtrelerinin dizinlerini birleştirebilir.
Dizin birleştirme özelliğini kullanabileceğiniz durumları belirleyerek dizine ekleme maliyetlerini azaltabilirsiniz. Örneğin, bir restoran puanı uygulaması için restaurants
koleksiyonunda:
restoran
burgerthyme
name : "Burger Thyme"
category : "burgers"
city : "San Francisco"
editors_pick : true
star_rating : 4
Bu uygulama, aşağıdakiler gibi sorgular kullanır. Uygulama, her zaman artan star_rating
değerine göre sıralama yaparken category
, city
ve editors_pick
için eşitlik koşullarının kombinasyonlarını kullanıyor:
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 | category, star_rating | Toplama |
restoranlar | şehir, star_rating | Toplama |
restoranlar | category, city, star_rating | Toplama |
restoranlar | category, city, editors_pick, star_rating | Toplama |
Daha iyi bir çözüm olarak, Cloud Firestore'nın eşitlik koşulları için dizinleri birleştirme özelliğinden yararlanarak dizin sayısını azaltabilirsiniz:
Toplama | Dizine eklenen alanlar | Sorgu kapsamı |
---|---|---|
restoranlar | category, star_rating | Toplama |
restoranlar | şehir, star_rating | Toplama |
restoranlar | editors_pick, star_rating | Toplama |
Bu dizin grubu daha küçük olmasının yanı sıra ek bir sorguyu da destekler:
Web
db.collection("restaurants").where("editors_pick", "==", true) .orderBy("star_rating")
Dizin oluşturma sınırları
Dizinler için aşağıdaki sınırlar geçerlidir. Kotalar ve sınırlar hakkında daha fazla bilgi 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üzeyi yapılandırması, aynı alan için birden fazla yapılandırma içerebilir. Örneğin, aynı alandaki tek alanlı dizin oluşturma muafiyeti ve TTL politikası, sınıra göre 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'ın 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. |
Birleşik dizindeki maksimum alan sayısı | 100 |
Dizin girişinin maksimum boyutu |
7,5 KiB Cloud Firestore'ın 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 otomatik dizine ekleme özelliğini kullanabilir ve dizinlerinizi yönetmek için hata mesajındaki bağlantıları kullanabilirsiniz. Ancak aşağıdaki durumlarda tek alan muafiyetleri eklemek isteyebilirsiniz:
Durum | Açıklama |
---|---|
Büyük dize alanları | Sorgulama için kullanmadığınız uzun dize değerlerini sık sık içeren bir dize alanınız varsa alanı dizine ekleme işleminden muaf tutarak depolama maliyetlerini azaltabilirsiniz. |
Sıralı değerler içeren belgeler barındıran bir koleksiyona yüksek yazma hızları | Bir koleksiyondaki belgeler arasında sıralı olarak artan veya azalan bir alanı (ör. zaman damgası) dizine eklerseniz koleksiyona maksimum yazma hızı saniyede 500 yazma işlemi olur. Sıralı değerlere sahip alana göre sorgu yapmıyorsanız bu sınırı atlamak için alanı dizine ekleme işleminden muaf tutabilirsiniz. Yüksek yazma hızına sahip bir IoT kullanım alanında (ör. zaman damgası alanı içeren dokümanların bulunduğu bir koleksiyon) saniyede 500 yazma sınırına yaklaşılabilir. |
TTL alanları |
TTL (geçerlilik süresi) politikaları kullanıyorsanız TTL alanının bir zaman damgası olması gerektiğini unutmayın. TTL alanlarında indeksleme varsayılan olarak etkindir ve daha yüksek trafik oranlarında performansı etkileyebilir. En iyi uygulama olarak, TTL alanlarınız için tek alan muafiyetleri ekleyin. |
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 göre sorgu yapmıyorsanız bunu dizine ekleme işleminden muaf tutmanız gerekir. |
Birden fazla 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 dizin oluşturma hususlarına bakın.
Dizine ekleme sorunlarını (dizine ekleme dağıtımı, INVALID_ARGUMENT
hataları) çözme hakkında daha fazla bilgi için sorun giderme sayfasına bakın.