ประเภทดัชนีใน 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 จะช่วยคุณ ระบุและสร้างดัชนีคอมโพสิตที่จำเป็น ในขณะที่คุณสร้างแอป

หากคุณพยายามสืบค้นข้อมูลด้านบนโดยไม่ได้สร้างดัชนีที่จำเป็นก่อน 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 รายการต่อเอกสาร หากคุณไม่ได้ทำการสืบค้นตามฟิลด์อาร์เรย์หรือแผนที่ขนาดใหญ่ คุณควรยกเว้นการจัดทำดัชนี