Dizinler, veritabanı performansında önemli bir faktördür. Bir kitaptaki konuları sayfa numaralarıyla eşleyen kitap dizini gibi, 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ü olan otomatik dizinler ve manuel dizinler açıklanmaktadır.
Dizin tanımı ve yapısı
Dizin, belirli bir dokümanın alan listesinde tanımlanır ve her alan için karşılık gelen bir dizin modu bulunur.
Dizin, dizin tanımında adı geçen her alan için bir giriş içerir. Dizin, dizine dayalı sorgular için potansiyel sonuçlar olan tüm dokümanları içerir. Bir doküman, yalnızca dizinde kullanılan her alan için dizine eklenmiş bir değer kümesi varsa dizine eklenir. Dizin tanımı, dokümanın değerinin ayarlanmadığı bir alana başvuruyorsa bu doküman dizinde görünmez. Bu durumda doküman, dizine dayalı herhangi bir sorgu için sonuç olarak hiçbir zaman döndürülmez.
Dizin, dizin tanımında belirtilen sırada alan değerlerine göre sıralanır.
Her sorgunun arkasında bir dizin vardır
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 dizinler kullanarak yüksek sorgu performansı sağlar. 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, dizin yönetimine ayırmanı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 oluşturmanıza ve tanımlamanıza yardımcı olur.
Dizin türleri
Cloud Firestore iki tür dizin kullanır: otomatik ve manuel. Manuel ve otomatik dizinler, yönetilme şekilleri açısından farklılık gösterir.
Otomatik dizinler
Varsayılan olarak Cloud Firestore, bir koleksiyondaki belgelerde bulunan her alan için otomatik olarak dizin oluşturur. Bu tek alanlı dizinler, birçok temel sorguyu gerçekleştirmenize olanak tanır. Otomatik dizinleri, veritabanınızın otomatik dizine ekleme ayarlarını ve dizin muafiyetlerini yapılandırarak yönetirsiniz.
Otomatik dizin varsayılanları
Cloud Firestore, otomatik dizinler için aşağıdaki varsayılan ayarları kullanır:
Dizi ve eşleme olmayan her alan için Cloud Firestore, biri artan modda, diğeri azalan modda olmak üzere iki koleksiyon kapsamlı dizin tanımlar.
Cloud Firestore, her harita alanı için aşağıdakileri oluşturur:
- Dizi ve eşleme olmayan her alt alan için bir koleksiyon kapsamlı artan dizin.
- Dizi ve eşleme olmayan her alt alan için bir koleksiyon kapsamlı azalan dizin.
- Tüm harita değeri için bir koleksiyon kapsamlı artan dizin
- Tüm harita değeri 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 dokümandaki her dizi alanı için aşağıdakileri oluşturur:
- Tüm dizi değeri için bir koleksiyon kapsamlı artan dizin
- Tüm dizi değeri için bir koleksiyon kapsamlı azalan dizin
- Bir koleksiyon kapsamlı array-contains dizini.
Koleksiyon grubu kapsamına sahip otomatik dizinler varsayılan olarak korunmaz.
Otomatik dizin muafiyetleri
Bir dizine ekleme 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 devre dışı bırakacağı bir dizini etkinleştirebilir veya otomatik dizine eklemenin etkinleştireceği bir dizini devre dışı bırakabilir. Muafiyetlerin yararlı olabileceği durumlar için dizine eklemeyle 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 alanları eşleştirebilir ve koleksiyon grubundaki tüm alanların dizine eklenmesini devre dışı bırakabilirsiniz. Ardından, yalnızca sorgularınız için gerekli alanları dizine eklemek üzere muafiyetler ekleyebilirsiniz. Dizine eklenen alanların sayısını azaltmak, depolama maliyetlerini düşürür ve yazma performansını artırabilir.
Bir harita alanı için dizin muafiyeti oluşturursanız haritanın alt alanları bu ayarları devralır. Ancak belirli alt alanlar için dizin muafiyetleri tanımlayabilirsiniz. Bir alt alanın muafiyetini silerseniz alt alan, varsa üst alanın muafiyet ayarlarını, üst muafiyet yoksa veritabanı genelindeki ayarları devralır.
Otomatik dizin muafiyetleri oluşturmak ve yönetmek için Dizinleri yönetme başlıklı makaleyi inceleyin.
Manuel dizinler
Manuel dizin, dizine eklenecek alanların sıralı listesine göre bir koleksiyondaki tüm dokümanların sıralı eşlemesini depolar.
Cloud Firestore, otomatik dizinler tarafından desteklenmeyen sorguları desteklemek için manuel dizinler kullanır.
Varsayılan olarak Cloud Firestore, bir koleksiyondaki her alan için otomatik olarak tek alanlı dizinler oluşturur. Olası alan kombinasyonlarının sayısı çok fazla olduğundan Cloud Firestore, alan kombinasyonları için otomatik olarak dizin oluşturmaz. Bunun yerine Cloud Firestore, uygulamanızı oluştururken gerekli dizinleri belirlemenize ve oluşturmanıza yardımcı olur.
Mevcut bir dizin tarafından desteklenmeyen bir sorgu denediğinizde Cloud Firestore, eksik dizini oluşturmak için kullanabileceğiniz bir bağlantı içeren hata mesajı döndürür.
Dizinleri konsolu veya Firebase CLI'yı kullanarak manuel olarak da tanımlayıp yönetebilirsiniz. Manuel 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ı
Otomatik ve manuel dizinleri farklı şekilde yapılandırırsınız ancak her ikisinde de dizinleriniz için dizin modlarını ve sorgu kapsamlarını yapılandırmanız gerekir.
Dizin modları
Dizin tanımlarken her dizine eklenen alan için bir dizin modu seçersiniz. Her alanın dizin modu, o alandaki belirli sorgu yan tümcelerini destekler. Aşağıdaki dizin modları arasından seçim yapabilirsiniz:
| Dizin modu | Açıklama |
|---|---|
| Artan | Alanda <, <=, ==, >=, >, !=, in ve not-in sorgu yan tümcelerini destekler ve sonuçların bu alan değerine göre artan düzende sıralanmasını destekler. |
| Azalan | Alanda <, <=, ==, >=, >, !=, in ve not-in sorgu yan tümcelerini destekler ve sonuçların bu alan değerine göre azalan düzende sıralanmasını destekler. |
| Array‑contains | Alanda array-contains ve array-contains-any sorgu yan tümcelerini destekler. |
| Vektör | Alanda FindNearest sorgu yan tümcelerini destekler. |
Sorgu kapsamları
Her dizinin kapsamı bir koleksiyon veya koleksiyon grubuyla sınırlıdır. Buna dizinin sorgu kapsamı denir:
- 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 karşılık gelen bir dizin oluşturmanız gerekir.
Varsayılan sıralama ve __name__ alanı
Dizinler, dokümanları her alan için belirtilen dizin modlarına göre (artan veya azalan) sıralamanın yanı sıra her dokümanın __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ümesinde aynı alan değerlerine sahip dokümanların doküman 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 | adı, __name__ |
Toplama |
| şehirler | eyaleti, __name__ |
Toplama |
| şehirler | ülke, nüfus, __name__ |
Toplama |
Sonuçları varsayılan olmayan __name__ yönüne göre sıralamak için bu dizini oluşturmanız gerekir.
Dizin özellikleri
Sorgunun en verimli şekilde yürütülmesini sağlayan dizin, aşağıdaki özelliklerle tanımlanır:
- Eşitlik filtrelerinde kullanılan alanlar
- Sıralama ölçütlerinde kullanılan alanlar
- Aralık ve eşitsizlik filtrelerinde kullanılan alanlar (sıralama ölçütlerine henüz dahil edilmemiş olanlar)
- Toplu işlemlerde kullanılan alanlar (sıralama ölçütlerine, aralık ve eşitsizlik filtrelerine henüz dahil edilmemiş olanlar)
Cloud Firestore, sorguların sonuçlarını şu şekilde hesaplar:
- Sorgunun koleksiyonuna, filtre özelliklerine, filtre operatörlerine ve sıralama ölçütlerine karşılık gelen dizini tanımlar.
- Taramanın başladığı dizin konumunu tanımlar. Başlangıç konumu, sorgunun eşitlik filtreleriyle başlar ve ilk
orderByalanındaki aralık ve eşitsizlik filtreleriyle biter. - Dizini taramaya başlar ve tarama işlemi aşağıdakilerden birini yapana kadar tüm filtreleri karşılayan her dokümanı döndürür:
- Filtre koşullarını karşılamayan bir dokümanla karşılaşır ve sonraki dokümanların filtre koşullarını hiçbir zaman tam olarak karşılamayacağını onaylar.
- Dizinin sonuna ulaştığında.
- 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ırma araçlarına dayalı basit sorgular yapmanıza olanak tanır. Dizi alanlarında array-contains ve array-contains-any sorguları yapmanıza olanak tanır.
Örnek olarak, aşağıdaki örnekleri dizin oluşturma açısından inceleyin. Aşağıdaki snippet, bir cities koleksiyonunda birkaç city belgesi oluşturur ve her belge için name, state, country, capital, population ve regions 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ı kullanıldığında Cloud Firestore, her alan için bir artan tek alan dizini, her alan için bir azalan 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 girişi temsil eder:
| Toplama | Alan dizine eklendi | Sorgu kapsamı |
|---|---|---|
| şehirler | adı | Toplama |
| şehirler | eyalet | Toplama |
| şehirler | ülke | Toplama |
| şehirler | büyük harf | Toplama |
| şehirler | nüfus | Toplama |
| şehirler | bölge | Toplama |
| şehirler | adı | Toplama |
| şehirler | eyalet | Toplama |
| şehirler | ülke | Toplama |
| şehirler | büyük harf | Toplama |
| şehirler | nüfus | Toplama |
| şehirler | bölge | 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ğı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");
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 gerekiyorsa ya da farklı bir alana göre sıralama yapmanız gerekiyorsa bu sorgu için manuel 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"])
Manuel dizinler tarafından desteklenen sorgular
Otomatik tek alanlı dizinler tarafından desteklenmeyen bileşik sorguları desteklemek için manuel dizinler oluşturun. Örneğin, aşağıdaki sorgular için manuel 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 dizin gereklidir. Sorgu, country alanı için eşitlik (== veya in) kullandığından bu alan için artan veya azalan dizin modunu kullanabilirsiniz. Varsayılan olarak, eşitsizlik yan tümceleri, eşitsizlik yan tümcesindeki alana göre artan sıralama ölçütü uygular.
| Toplama | Dizine eklenen alanlar | Sorgu kapsamı |
|---|---|---|
| şehirler | (veya ) ülke, nüfus | Toplama |
Aynı sorguları azalan sıralama ölçütüyle çalıştırmak için population için azalan yönde ek bir 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 |
| şehir | ülke, nüfus | Toplama |
Dizin birleştirme nedeniyle performans kaybı yaşamamak için array-contains veya array-contains-any sorgusunu ek yan tümcelerle birleştiren bir 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 harf | Toplama |
Koleksiyon grubu dizinleri tarafından desteklenen sorgular
Koleksiyon grubu kapsamına sahip bir dizini göstermek için bazı city belgelerine bir 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 kapsamına sahip aşağıdaki tek alanlı dizini 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"])Ö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 koleksiyon grubu kapsamına sahip landmarks tek alanlı bir 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ıralanmış sonuçlar döndüren bir koleksiyon grubu sorgusu çalıştırmak için koleksiyon grubu kapsamına sahip karşılık gelen bir dizini etkinleştirmeniz gerekir. Ancak sonuçları filtrelemeyen veya sıralamayan koleksiyon grubu sorguları için ek dizin tanımı gerekmez.
Örneğin, ek bir dizini 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ı, belgenin 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 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"]
Otomatik dizinler
- city_name ASC
- city_name DESC
- mahalleler ASC
- neighborhoods DESC
- sıcaklıklar ASC
- sıcaklıklar DESC
- temperatures.summer ASC
- temperatures.summer DESC
- temperatures.winter ASC
- temperatures.winter DESC
- neighborhoods Array Contains
Manuel dizinler
- city_name ASC, neighborhoods ARRAY
- city_name DESC, neighborhoods ARRAY
Dizin girişleri
Bu dizine ekleme yapılandırması, doküman için aşağıdaki dizin girişleriyle sonuçlanır:
| Dizin | Dizine eklenen veriler |
|---|---|
| Otomatik dizin girişleri | |
| city_name ASC | city_name: "San Francisco" |
| city_name DESC | city_name: "San Francisco" |
| mahalleler ASC | neighborhoods: ["Mission", "Downtown", "Marina"] |
| neighborhoods DESC | neighborhoods: ["Mission", "Downtown", "Marina"] |
| sıcaklıklar ASC | sıcaklıklar: {yaz: 67, kış: 55} |
| sıcaklıklar DESC | sıcaklıklar: {yaz: 67, kış: 55} |
| 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 | neighborhoods: "Mission" |
| neighborhoods Array Contains | neighborhoods: "Downtown" |
| neighborhoods Array Contains | neighborhoods: "Marina" |
| Manuel 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ı boyutunu hesaplama hakkında daha fazla bilgi için Dizin girişi boyutu başlıklı makaleyi inceleyin.
Dizin birleştirmeyi kullanma
Cloud Firestore her sorgu için bir dizin kullansa da her sorgu için bir dizin gerektirmez. Birden fazla eşitlik (==) yan tümcesi ve isteğe bağlı olarak bir orderBy yan tümcesi içeren sorgular için Cloud Firestore, mevcut dizinleri yeniden kullanabilir. Cloud Firestore, daha büyük eşitlik sorguları için gereken dizinleri oluşturmak üzere basit eşitlik filtrelerinin dizinlerini birleştirebilir.
Dizin birleştirmeyi kullanabileceğiniz durumları belirleyerek dizine ekleme maliyetlerini azaltabilirsiniz. Örneğin, restoran puanlama uygulaması için bir 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, category, city ve editors_pick için eşitlik yan tümcelerinin kombinasyonlarını kullanırken her zaman artan star_rating değerine göre sıralama yapar:
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, star_rating | Toplama |
| restoranlar | kategori, şehir, yıldız_puanı | Toplama |
| restoranlar | kategori, şehir, editörün seçimi, yıldız puanı | Toplama |
Daha iyi bir çözüm olarak, Cloud Firestore'ın eşitlik yan tümceleri 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, 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")Dizine ekleme 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 tek alan yapılandırmalarının maksimum sayısı |
Bir alan düzeyinde yapılandırma, aynı alan için birden fazla yapılandırma içerebilir. Örneğin, aynı alandaki tek alanlı dizine ekleme muafiyeti ve TTL politikası, sınıra doğru 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 aracının bir dokümanı ve bir dizin grubunu nasıl dizin girişlerine dönüştürdüğünü görmek için bu dizin girişi sayısı örneğine bakın. |
| Bileşik dizindeki maksimum alan sayısı | 100 |
| Dizin girişinin maksimum boyutu |
7,5 KiB Cloud Firestore uygulamasının dizin girişi boyutunu nasıl hesapladığını görmek için dizin girişi boyutu bölümüne bakın. |
| 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 ve hata mesajı bağlantılarını kullanabilirsiniz. Ancak aşağıdaki durumlarda otomatik dizine ekleme 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 barındıran bir dize alanınız varsa alanı dizine eklemeden muaf tutarak depolama maliyetlerini azaltabilirsiniz. |
| Sıralı değerler içeren dokümanların bulunduğu 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ğerler içeren alana göre sorgu yapmıyorsanız bu sınırı atlamak için alanı dizine eklemeden muaf tutabilirsiniz. Örneğin, yazma hızının yüksek olduğu bir IoT kullanım alanında, zaman damgası alanı içeren dokümanların bulunduğu 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 otomatik dizine ekleme muafiyetleri ekleyin. |
| Büyük dizi veya harita alanları | Büyük dizi veya harita alanları,doküman başına 40.000 dizin girişi sınırına yaklaşabilir. Büyük bir dizi veya harita alanına göre sorgulama yapmıyorsanız bu alanı 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 dizine ekleme ile ilgili hususlara bakın.
Dizine ekleme sorunlarını (dizin yayılımı, INVALID_ARGUMENT hataları) çözme hakkında daha fazla bilgi için sorun giderme sayfasına bakın.