ดัชนีเป็นปัจจัยสำคัญในประสิทธิภาพของฐานข้อมูล เช่นเดียวกับดัชนีของหนังสือซึ่งจับคู่หัวข้อในหนังสือกับหมายเลขหน้า ดัชนีฐานข้อมูลจะจับคู่รายการในฐานข้อมูลกับตำแหน่งในฐานข้อมูล เมื่อคุณส่งแบบสอบถามฐานข้อมูล ฐานข้อมูลสามารถใช้ดัชนีเพื่อค้นหาตำแหน่งของรายการที่คุณร้องขอได้อย่างรวดเร็ว
หน้านี้อธิบายดัชนีสองประเภทที่ Cloud Firestore ใช้ ได้แก่ ดัชนีฟิลด์เดียว และดัชนี คอมโพสิต
ดัชนีเบื้องหลังทุกคำถาม
หากไม่มีดัชนีสำหรับคิวรี ฐานข้อมูลส่วนใหญ่จะรวบรวมข้อมูลผ่านรายการเนื้อหาทีละรายการ ซึ่งเป็นกระบวนการที่ช้าซึ่งจะยิ่งช้าลงเมื่อฐานข้อมูลเติบโตขึ้น Cloud Firestore รับประกันประสิทธิภาพการสืบค้นสูงโดยใช้ดัชนีสำหรับการสืบค้น ทั้งหมด ด้วยเหตุนี้ ประสิทธิภาพของคิวรีจึงขึ้นอยู่กับขนาดของชุดผลลัพธ์ ไม่ใช่จำนวนรายการในฐานข้อมูล
จัดการดัชนีน้อยลง พัฒนาแอพมากขึ้น
Cloud Firestore มีฟีเจอร์ที่ช่วยลดระยะเวลาที่คุณต้องใช้ในการจัดการดัชนี ดัชนีที่จำเป็นสำหรับการสืบค้นข้อมูลพื้นฐานที่สุดจะถูกสร้างขึ้นโดยอัตโนมัติสำหรับคุณ ในขณะที่คุณใช้และทดสอบแอปของคุณ Cloud Firestore จะช่วยคุณระบุและ สร้างดัชนีเพิ่มเติม ที่แอปของคุณต้องการ
ประเภทดัชนี
Cloud Firestore ใช้ดัชนีสองประเภท: ฟิลด์เดียว และ คอมโพสิต นอกจากจำนวนฟิลด์ที่จัดทำดัชนีแล้ว ดัชนีฟิลด์เดียวและดัชนีผสมจะแตกต่างกันในวิธีที่คุณจัดการ
ดัชนีฟิลด์เดียว
ดัชนีเขตข้อมูลเดียวเก็บการแมปเรียงลำดับของเอกสารทั้งหมดในคอลเลกชันที่มีเขตข้อมูลเฉพาะ แต่ละรายการในดัชนีเขตข้อมูลเดียวจะบันทึกค่าของเอกสารสำหรับเขตข้อมูลเฉพาะและตำแหน่งของเอกสารในฐานข้อมูล Cloud Firestore ใช้ดัชนีเหล่านี้เพื่อดำเนินการค้นหาพื้นฐานหลายอย่าง คุณจัดการดัชนีฟิลด์เดียวโดยกำหนดการตั้งค่าการจัดทำดัชนีอัตโนมัติและการยกเว้นดัชนีของฐานข้อมูลของคุณ
การจัดทำดัชนีอัตโนมัติ
โดยค่าเริ่มต้น Cloud Firestore จะรักษาดัชนีฟิลด์เดียวโดยอัตโนมัติสำหรับแต่ละฟิลด์ในเอกสารและแต่ละฟิลด์ย่อยในแผนที่ Cloud Firestore ใช้การตั้งค่าเริ่มต้นต่อไปนี้สำหรับดัชนีช่องเดียว:
สำหรับแต่ละฟิลด์ที่ไม่ใช่อาเรย์และไม่ใช่แผนที่ Cloud Firestore จะกำหนดดัชนีฟิลด์เดียว ขอบเขตคอลเลกชัน สองรายการ หนึ่งรายการอยู่ในโหมดจากน้อยไปมาก และอีกรายการหนึ่งอยู่ในโหมดจากมากไปหาน้อย
สำหรับแต่ละฟิลด์แผนที่ Cloud Firestore จะสร้างดัชนีจากน้อยไปมากในขอบเขตคอลเล็กชันหนึ่งรายการและดัชนีจากมากไปหาน้อยหนึ่งรายการสำหรับฟิลด์ย่อยที่ไม่ใช่อาร์เรย์และที่ไม่ใช่แผนที่ในแผนที่
สำหรับแต่ละฟิลด์อาร์เรย์ในเอกสาร Cloud Firestore จะสร้างและรักษาดัชนีอาร์เรย์ที่มีขอบเขตคอลเลกชัน
ดัชนีฟิลด์เดียวที่มีขอบเขตกลุ่มคอลเล็กชันจะไม่ได้รับการดูแลตามค่าเริ่มต้น
การยกเว้นดัชนีช่องเดียว
คุณสามารถยกเว้นฟิลด์จากการตั้งค่าการ ทำดัชนีอัตโนมัติ ของคุณโดยการสร้างการยกเว้นดัชนีฟิลด์เดียว การยกเว้นการทำดัชนีจะแทนที่การตั้งค่าดัชนีอัตโนมัติทั่วทั้งฐานข้อมูล การยกเว้นสามารถเปิดใช้งานดัชนีแบบฟิลด์เดียว ซึ่งการตั้งค่าการทำดัชนีอัตโนมัติของคุณจะปิดหรือปิดใช้งานดัชนีฟิลด์เดียวที่การจัดทำดัชนีอัตโนมัติจะเปิดใช้งานเป็นอย่างอื่น สำหรับกรณีที่การยกเว้นมีประโยชน์ โปรดดู แนวทางปฏิบัติที่ดีที่สุดในการสร้างดัชนี
หากคุณสร้างข้อยกเว้นดัชนีฟิลด์เดียวสำหรับฟิลด์แผนที่ ฟิลด์ย่อยของแผนที่จะรับช่วงการตั้งค่าเหล่านั้น อย่างไรก็ตาม คุณสามารถกำหนดข้อยกเว้นดัชนีฟิลด์เดียวสำหรับฟิลด์ย่อยเฉพาะได้ หากคุณลบการยกเว้นสำหรับฟิลด์ย่อย ฟิลด์ย่อยจะรับช่วงการตั้งค่าการยกเว้นของพาเรนต์ หากมี หรือการตั้งค่าทั้งฐานข้อมูลหากไม่มีการยกเว้นพาเรนต์
ในการสร้างและจัดการการยกเว้นดัชนีฟิลด์เดียว โปรดดูที่การ จัดการดัชนีใน Cloud Firestore
ดัชนีคอมโพสิต
ดัชนีแบบรวมจะจัดเก็บการแมปที่เรียงลำดับของเอกสารทั้งหมดในคอลเลกชั่น โดยยึดตามรายการของเขตข้อมูลที่จะทำดัชนีตามลำดับ
Cloud Firestore ใช้ดัชนีผสมเพื่อรองรับการสืบค้นที่ดัชนีช่องเดียวไม่รองรับ
Cloud Firestore ไม่ได้สร้างดัชนีคอมโพสิตโดยอัตโนมัติเหมือนกับที่ทำกับดัชนีฟิลด์เดียว เนื่องจากมีการรวมฟิลด์ที่เป็นไปได้จำนวนมาก แต่ Cloud Firestore จะช่วยคุณ ระบุและสร้างดัชนีคอมโพสิตที่จำเป็น ในขณะที่คุณสร้างแอป
หากคุณพยายามสืบค้นข้อมูลด้านบนโดยไม่ได้สร้างดัชนีที่จำเป็นก่อน Cloud Firestore จะแสดงข้อความแสดงข้อผิดพลาดที่มีลิงก์ซึ่งคุณสามารถติดตามเพื่อสร้างดัชนีที่ขาดหายไปได้ สิ่งนี้จะเกิดขึ้นทุกครั้งที่คุณพยายามค้นหาที่ดัชนีไม่รองรับ คุณยังสามารถกำหนดและจัดการดัชนีคอมโพสิตด้วยตนเองโดยใช้คอนโซลหรือโดยใช้ Firebase CLI สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการสร้างและจัดการดัชนีคอมโพสิต โปรดดูที่ การ จัดการดัชนี
โหมดดัชนีและขอบเขตการสืบค้น
คุณกำหนดค่าดัชนีฟิลด์เดียวและดัชนีผสมต่างกัน แต่ทั้งคู่ต้องการให้คุณกำหนดค่าโหมดดัชนีและขอบเขตการสืบค้นสำหรับดัชนีของคุณ
โหมดดัชนี
เมื่อคุณกำหนดดัชนี คุณต้องเลือกโหมดดัชนีสำหรับแต่ละฟิลด์ที่จัดทำดัชนี โหมดดัชนีของแต่ละฟิลด์สนับสนุนส่วนคำสั่งแบบสอบถามเฉพาะบนฟิลด์นั้น คุณสามารถเลือกจากโหมดดัชนีต่อไปนี้:
โหมดดัชนี | คำอธิบาย |
---|---|
จากน้อยไปมาก | รองรับ < , <= , == , >= , > , != , in , and not-in , query clauses ในฟิลด์ และสนับสนุนการเรียงลำดับผลลัพธ์ในลำดับจากน้อยไปมากตามค่าฟิลด์นี้ |
จากมาก ไปน้อย | รองรับ < , <= , == , >= , > , != , in , และส่วนคำสั่งแบบสอบถามที่ not-in อยู่ในฟิลด์ และสนับสนุนการเรียงลำดับผลลัพธ์จากมากไปหาน้อยตามค่าฟิลด์นี้ |
Array-ประกอบด้วย | รองรับ array-contains และ array-contains-any บนฟิลด์ |
ขอบเขตการสืบค้น
ดัชนีแต่ละรายการกำหนดขอบเขตเป็นคอลเลกชันหรือกลุ่มคอลเลกชัน สิ่งนี้เรียกว่าขอบเขตการสืบค้นของดัชนี:
- ขอบเขตการรวบรวม
- Cloud Firestore สร้างดัชนีที่มีขอบเขตการรวบรวมโดยค่าเริ่มต้น ดัชนีเหล่านี้สนับสนุนการสืบค้นที่ส่งคืนผลลัพธ์จากคอลเล็กชันเดียว
- ขอบเขตกลุ่มคอลเลกชัน
- กลุ่มคอลเลกชันประกอบด้วยคอลเลกชันทั้งหมดที่มีรหัสคอลเลกชันเดียวกัน ในการเรียกใช้ แบบสอบถามกลุ่มคอลเลกชัน ที่ส่งคืนผลลัพธ์ที่กรองหรือเรียงลำดับจากกลุ่มคอลเลกชัน คุณต้องสร้างดัชนีที่สอดคล้องกับขอบเขตกลุ่มคอลเลกชัน
ตัวอย่างการจัดทำดัชนี
ด้วยการสร้างดัชนีฟิลด์เดียวให้คุณโดยอัตโนมัติ Cloud Firestore ช่วยให้แอปพลิเคชันของคุณรองรับการสืบค้นฐานข้อมูลพื้นฐานได้อย่างรวดเร็วที่สุด ดัชนีฟิลด์เดียวช่วยให้คุณสามารถดำเนินการค้นหาอย่างง่ายโดยยึดตามค่าฟิลด์และตัวเปรียบเทียบ <
, <=
, ==
, >=
, >
และ in
สำหรับฟิลด์อาร์เรย์ จะอนุญาตให้คุณดำเนินการค้นหา array-contains
array-contains-any
และแบบมีอาร์เรย์ได้
เพื่อแสดงให้เห็น ให้ตรวจสอบตัวอย่างต่อไปนี้จากมุมมองของการสร้างดัชนี ตัวอย่างต่อไปนี้สร้างเอกสาร city
สองสามชุดในคอลเล็กชัน cities
และตั้งค่าฟิลด์ name
, state
, country
, capital
, population
และ tags
สำหรับแต่ละเอกสาร:
เว็บ
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"] });
สมมติว่าการตั้งค่าการจัดทำดัชนีอัตโนมัติเป็นค่าเริ่มต้น Cloud Firestore จะอัปเดตดัชนีฟิลด์เดียวจากน้อยไปมากหนึ่งรายการต่อฟิลด์ที่ไม่ใช่อาร์เรย์ ดัชนีฟิลด์เดียวจากมากไปน้อยหนึ่งรายการต่อฟิลด์ที่ไม่ใช่อาร์เรย์ และหนึ่งรายการมีดัชนีฟิลด์เดียวสำหรับฟิลด์อาร์เรย์ แต่ละแถวในตารางต่อไปนี้แสดงถึงรายการในดัชนีฟิลด์เดียว:
ของสะสม | ฟิลด์ที่จัดทำดัชนี | ขอบเขตการสืบค้น |
---|---|---|
เมือง | ชื่อ | ของสะสม |
เมือง | รัฐ | ของสะสม |
เมือง | ประเทศ | ของสะสม |
เมือง | ทุน | ของสะสม |
เมือง | ประชากร | ของสะสม |
เมือง | ชื่อ | ของสะสม |
เมือง | รัฐ | ของสะสม |
เมือง | ประเทศ | ของสะสม |
เมือง | ทุน | ของสะสม |
เมือง | ประชากร | ของสะสม |
เมือง | array-contains ภูมิภาค | ของสะสม |
แบบสอบถามได้รับการสนับสนุนโดยดัชนีฟิลด์เดียว
เมื่อใช้ดัชนีฟิลด์เดียวที่สร้างขึ้นโดยอัตโนมัติเหล่านี้ คุณสามารถเรียกใช้คำสั่งง่ายๆ ดังต่อไปนี้:
เว็บ
const stateQuery = citiesRef.where("state", "==", "CA"); const populationQuery = citiesRef.where("population", "<", 100000); const nameQuery = citiesRef.where("name", ">=", "San Francisco");
คุณยังสามารถสร้างและรวมข้อความค้นหา in
เท่าเทียมกัน ( ==
) ได้:
เว็บ
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)
หากคุณต้องการเรียกใช้คิวรีแบบผสมที่ใช้การเปรียบเทียบช่วง ( <
, <=
, >
หรือ >=
) หรือถ้าคุณต้องการจัดเรียงตามฟิลด์อื่น คุณต้องสร้าง ดัชนีผสม สำหรับคิวรีนั้น
ดัชนี array-contains
ช่วยให้คุณสามารถสอบถามเขตข้อมูลอาร์เรย์ของ regions
ได้:
เว็บ
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"])
แบบสอบถามได้รับการสนับสนุนโดยดัชนีคอมโพสิต
Cloud Firestore ใช้ดัชนีแบบผสมเพื่อรองรับการสืบค้นแบบผสมที่ดัชนีช่องเดียวไม่รองรับ ตัวอย่างเช่น คุณจะต้องมีดัชนีผสมสำหรับข้อความค้นหาต่อไปนี้:
เว็บ
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)
ข้อความค้นหาเหล่านี้ต้องการดัชนีผสมด้านล่าง เนื่องจากแบบสอบถามใช้ความเท่าเทียมกัน ( ==
หรือ in
) สำหรับฟิลด์ country
คุณสามารถใช้โหมดดัชนีจากน้อยไปมากหรือมากไปหาน้อยสำหรับฟิลด์นี้ ตามค่าเริ่มต้น อนุประโยคความไม่เท่าเทียมกันจะใช้การเรียงลำดับจากน้อยไปมากตามฟิลด์ในอนุประโยคความไม่เท่าเทียมกัน
ของสะสม | ฟิลด์ที่จัดทำดัชนี | ขอบเขตการสืบค้น |
---|---|---|
เมือง | (หรือ ) ประเทศ ประชากร | ของสะสม |
ในการรันเคียวรีเดียวกันแต่มีลำดับการจัดเรียงจากมากไปน้อย คุณต้องมีดัชนีคอมโพสิตเพิ่มเติมในทิศทางจากมากไปหาน้อยสำหรับ 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")
ของสะสม | ฟิลด์ที่จัดทำดัชนี | ขอบเขตการสืบค้น |
---|---|---|
เมือง | ประเทศ, ประชากร | ของสะสม |
เมือง | ประเทศ , ประชากร | ของสะสม |
คุณต้องสร้างดัชนีผสมเพื่อรวม array-contains
หรือประกอบด้วย array-contains-any
กับส่วนคำสั่งเพิ่มเติม
เว็บ
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)
ของสะสม | ฟิลด์ที่จัดทำดัชนี | ขอบเขตการสืบค้น |
---|---|---|
เมือง | อาร์เรย์ที่มี แท็ก, | (หรือ ) ตัวพิมพ์ใหญ่ของสะสม |
แบบสอบถามได้รับการสนับสนุนโดยดัชนีกลุ่มคอลเลกชัน
หากต้องการแสดงดัชนีที่มีขอบเขตกลุ่มคอลเลกชัน ลองนึกภาพว่าคุณเพิ่มคอลเล็กชันย่อยของ landmarks
ในเอกสารบาง city
:
เว็บ
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" });
เมื่อใช้ดัชนีฟิลด์เดียวต่อไปนี้กับขอบเขตคอลเลกชัน คุณสามารถค้นหาคอลเล็กชัน landmarks
ของเมืองเดียวตามฟิลด์ category
ได้:
ของสะสม | ฟิลด์ที่จัดทำดัชนี | ขอบเขตการสืบค้น |
---|---|---|
สถานที่สำคัญ | (หรือ ) หมวดหมู่ | ของสะสม |
เว็บ
citiesRef.doc("SF").collection("landmarks").where("category", "==", "park") citiesRef.doc("SF").collection("landmarks").where("category", "in", ["park", "museum"])
ลองนึกภาพว่าคุณสนใจที่จะสอบถามสถานที่สำคัญทั่วทุกเมือง เมื่อต้องการเรียกใช้แบบสอบถามนี้ในกลุ่มคอลเลกชันที่ประกอบด้วยคอลเลกชัน landmarks
ทั้งหมด คุณต้องเปิดใช้งานดัชนีฟิลด์เดียว landmarks
มีขอบเขตกลุ่มคอลเลกชัน:
ของสะสม | ฟิลด์ที่จัดทำดัชนี | ขอบเขตการสืบค้น |
---|---|---|
สถานที่สำคัญ | (หรือ ) หมวดหมู่ | กลุ่มคอลเลกชัน |
เมื่อเปิดใช้งานดัชนีนี้ คุณสามารถค้นหากลุ่มรวบรวม landmarks
ได้:
เว็บ
var landmarksGroupRef = db.collectionGroup("landmarks"); landmarksGroupRef.where("category", "==", "park") landmarksGroupRef.where("category", "in", ["park", "museum"])
เมื่อต้องการเรียกใช้แบบสอบถามกลุ่มคอลเลกชันที่ส่งกลับผลลัพธ์ที่กรองหรือเรียงลำดับ คุณต้องเปิดใช้งานดัชนีฟิลด์เดียวหรือดัชนีรวมที่สอดคล้องกับขอบเขตกลุ่มคอลเลกชัน คิวรีกลุ่มคอลเลกชันที่ไม่กรองหรือเรียงลำดับผลลัพธ์ ไม่ต้องการคำจำกัดความดัชนีเพิ่มเติมใดๆ
ตัวอย่างเช่น คุณสามารถเรียกใช้แบบสอบถามกลุ่มคอลเลกชันต่อไปนี้โดยไม่ต้องเปิดใช้งานดัชนีเพิ่มเติม:
เว็บ
db.collectionGroup("landmarks").get()
รายการดัชนี
ดัชนีที่กำหนดค่าของโปรเจ็กต์ของคุณ ตลอดจนโครงสร้างของเอกสาร ทั้งคู่ส่งผลต่อรายการดัชนีสำหรับเอกสาร ซึ่งท้ายที่สุดจะนับรวมใน ขีดจำกัดการนับรายการดัชนี
นี่คือตัวอย่างเพื่อแสดงให้เห็น
เอกสาร
name : "San Francisco"
temperatures : {summer: 67, winter: 55}
neighborhoods : ["Mission", "Downtown", "Marina"]
ดัชนีช่องเดียว
- (อัตโนมัติ) ชื่อ ASC & DESC
- (อัตโนมัติ) อุณหภูมิ ASC & DESC
- (อัตโนมัติ) ย่านอาร์เรย์ประกอบด้วย
ดัชนีคอมโพสิต
- ชื่อ ASC ย่าน ASC
- ชื่อ DESC ย่าน ASC
รายการดัชนีผลลัพธ์
การกำหนดค่าการทำดัชนีนี้ส่งผลให้เกิดรายการดัชนี 12 รายการต่อไปนี้สำหรับเอกสาร:
ดัชนี | รายการ |
---|---|
ชื่อ ASC & DESC | ชื่อ "ซานฟรานซิสโก" |
อุณหภูมิ ASC & DESC | อุณหภูมิฤดูร้อน: 67 |
อุณหภูมิ ASC & DESC | อุณหภูมิฤดูหนาว: 55 |
พื้นที่ใกล้เคียง Array ประกอบด้วย | พื้นที่ใกล้เคียง: "ภารกิจ" |
พื้นที่ใกล้เคียง Array ประกอบด้วย | ย่าน: "ดาวน์ทาวน์" |
พื้นที่ใกล้เคียง Array ประกอบด้วย | ย่าน: "มารีน่า" |
ชื่อ ASC ย่าน ASC | ชื่อ: "ซานฟรานซิสโก" บริเวณใกล้เคียง: "ภารกิจ" |
ชื่อ ASC ย่าน ASC | ชื่อ: "ซานฟรานซิสโก" บริเวณใกล้เคียง: "ดาวน์ทาวน์" |
ชื่อ ASC ย่าน ASC | ชื่อ: "ซานฟรานซิสโก" บริเวณใกล้เคียง: "มารีน่า" |
ชื่อ DESC ย่าน ASC | ชื่อ: "ซานฟรานซิสโก" บริเวณใกล้เคียง: "ภารกิจ" |
ชื่อ DESC ย่าน ASC | ชื่อ: "ซานฟรานซิสโก" บริเวณใกล้เคียง: "ดาวน์ทาวน์" |
ชื่อ DESC ย่าน ASC | ชื่อ: "ซานฟรานซิสโก" บริเวณใกล้เคียง: "มารีน่า" |
ดัชนีและราคา
ดัชนีมีส่วนทำให้ ต้นทุนการจัดเก็บ ของแอปพลิเคชันของคุณ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการคำนวณขนาดพื้นที่จัดเก็บสำหรับดัชนี โปรดดู ที่ ขนาดรายการดัชนี
การใช้ประโยชน์จากการรวมดัชนี
แม้ว่า Cloud Firestore จะใช้ดัชนีสำหรับทุกการสืบค้น แต่ก็ไม่จำเป็นต้องใช้ดัชนีเดียวต่อการค้นหา สำหรับการสืบค้นที่มีอนุประโยคความเท่าเทียมกันหลายรายการ ( ==
) และคำสั่งย่อย orderBy
หรือไม่ก็ได้ Cloud Firestore สามารถใช้ดัชนีที่มีอยู่ซ้ำได้ Cloud Firestore สามารถรวมดัชนีสำหรับตัวกรองความเท่าเทียมกันอย่างง่าย เพื่อสร้างดัชนีคอมโพสิตที่จำเป็นสำหรับการค้นหาความเท่าเทียมกันที่มากขึ้น
คุณสามารถลดต้นทุนการจัดทำดัชนีโดยระบุสถานการณ์ที่คุณสามารถใช้ประโยชน์จากการรวมดัชนีได้ ตัวอย่างเช่น ลองนึกภาพคอลเล็กชัน restaurants
สำหรับแอปให้คะแนนร้านอาหาร:
name : "Burger Thyme"
category : "burgers"
city : "San Francisco"
editors_pick : true
star_rating : 4
ลองนึกภาพว่าแอปนี้ใช้ข้อความค้นหาแบบเดียวกับด้านล่างนี้ โปรดสังเกตว่าแอพใช้การผสมผสานของประโยคความเท่าเทียมกันสำหรับ category
, city
และ editors_pick
ในขณะที่เรียงลำดับตามน้อยไปหามาก 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")
คุณสามารถสร้างดัชนีสำหรับแต่ละแบบสอบถาม:
ของสะสม | ฟิลด์ที่จัดทำดัชนี | ขอบเขตการสืบค้น |
---|---|---|
ร้านอาหาร | หมวดหมู่ | , star_ratingของสะสม |
ร้านอาหาร | เมือง star_rating | ของสะสม |
ร้านอาหาร | หมวดหมู่ | , เมือง, star_ratingของสะสม |
ร้านอาหาร | หมวดหมู่ | , เมือง, editors_pick, star_ratingของสะสม |
วิธีแก้ปัญหาที่ดีกว่า คุณสามารถลดจำนวนดัชนีได้โดยใช้ประโยชน์จากความสามารถของ Cloud Firestore ในการผสานดัชนีสำหรับส่วนคำสั่งความเท่าเทียมกัน:
ของสะสม | ฟิลด์ที่จัดทำดัชนี | ขอบเขตการสืบค้น |
---|---|---|
ร้านอาหาร | หมวดหมู่ | , star_ratingของสะสม |
ร้านอาหาร | เมือง star_rating | ของสะสม |
ร้านอาหาร | editors_pick, star_rating | ของสะสม |
ไม่เพียงแต่ชุดดัชนีนี้มีขนาดเล็กลงเท่านั้น แต่ยังรองรับการสืบค้นเพิ่มเติมอีกด้วย:
เว็บ
db.collection("restaurants").where("editors_pick", "==", true) .orderBy("star_rating")
ขีดจำกัดการจัดทำดัชนี
ขีดจำกัดต่อไปนี้ใช้กับดัชนี สำหรับโควต้าและขีดจำกัดทั้งหมด โปรดดูที่ โควต้าและขีดจำกัด
ขีดจำกัด | รายละเอียด |
---|---|
จำนวนสูงสุดของดัชนีคอมโพสิตสำหรับฐานข้อมูล | 200 |
จำนวนการยกเว้นดัชนีฟิลด์เดียวสูงสุดสำหรับฐานข้อมูล | 200 |
จำนวนรายการดัชนีสูงสุดสำหรับแต่ละเอกสาร | 40,000 จำนวนรายการดัชนีคือผลรวมต่อไปนี้สำหรับเอกสาร:
หากต้องการดูว่า Cloud Firestore เปลี่ยนเอกสารและชุดดัชนีเป็นรายการดัชนี ให้ดู ที่ ตัวอย่างการนับรายการดัชนี |
ขนาดสูงสุดของรายการดัชนี | 7.5 KiB หากต้องการดูว่า Cloud Firestore คำนวณขนาดรายการดัชนีอย่างไร โปรดดู ขนาดรายการดัชนี |
ผลรวมสูงสุดของขนาดรายการดัชนีของเอกสาร | 8 MiB ขนาดรวมเป็นผลรวมของต่อไปนี้สำหรับเอกสาร: |
ขนาดสูงสุดของค่าฟิลด์ที่จัดทำดัชนี | 1500 ไบต์ ค่าฟิลด์ที่มากกว่า 1500 ไบต์จะถูกตัดทอน แบบสอบถามที่เกี่ยวข้องกับค่าฟิลด์ที่ถูกตัดทอนอาจส่งกลับผลลัพธ์ที่ไม่สอดคล้องกัน |
แนวทางปฏิบัติที่ดีที่สุดในการสร้างดัชนี
สำหรับแอพส่วนใหญ่ คุณสามารถพึ่งพาการจัดทำดัชนีอัตโนมัติและลิงก์ข้อความแสดงข้อผิดพลาดเพื่อจัดการดัชนีของคุณ อย่างไรก็ตาม คุณอาจต้องการเพิ่มการยกเว้นฟิลด์เดียวในกรณีต่อไปนี้:
กรณี | คำอธิบาย |
---|---|
ช่องสตริงขนาดใหญ่ | หากคุณมีฟิลด์สตริงที่มักจะเก็บค่าสตริงแบบยาวซึ่งคุณไม่ได้ใช้สำหรับการสอบถาม คุณสามารถลดต้นทุนการจัดเก็บได้โดยการยกเว้นฟิลด์จากการจัดทำดัชนี |
อัตราการเขียนสูงไปยังคอลเลกชันที่มีเอกสารที่มีค่าตามลำดับ | หากคุณสร้างดัชนีฟิลด์ที่เพิ่มหรือลดลงตามลำดับระหว่างเอกสารในคอลเล็กชัน เช่น การประทับเวลา อัตราการเขียนสูงสุดในคอลเล็กชันคือ 500 การเขียนต่อวินาที ถ้าคุณไม่สอบถามตามฟิลด์ที่มีค่าตามลำดับ คุณสามารถยกเว้นฟิลด์จากการจัดทำดัชนีเพื่อข้ามขีดจำกัดนี้ ในกรณีการใช้งาน IoT ที่มีอัตราการเขียนสูง ตัวอย่างเช่น คอลเลกชันที่มีเอกสารที่มีฟิลด์การประทับเวลาอาจเข้าใกล้ขีดจำกัดการเขียน 500 รายการต่อวินาที |
อาร์เรย์ขนาดใหญ่หรือฟิลด์แผนที่ | ฟิลด์อาร์เรย์หรือแผนที่ขนาดใหญ่สามารถเข้าถึงรายการดัชนีได้ถึง 40,000 รายการต่อเอกสาร หากคุณไม่ได้ทำการสืบค้นตามฟิลด์อาร์เรย์หรือแผนที่ขนาดใหญ่ คุณควรยกเว้นการจัดทำดัชนี |