ประเภทดัชนีใน Cloud Firestore

ดัชนีเป็นปัจจัยสำคัญในประสิทธิภาพของฐานข้อมูล เช่นเดียวกับดัชนีของหนังสือที่จับคู่หัวข้อในหนังสือกับหมายเลขหน้า ดัชนีฐานข้อมูลจะจับคู่รายการในฐานข้อมูลกับตำแหน่งของรายการในฐานข้อมูล เมื่อคุณส่งแบบสอบถามไปยังฐานข้อมูล ฐานข้อมูลจะสามารถใช้ดัชนีเพื่อค้นหาตำแหน่งของรายการที่คุณร้องขอได้อย่างรวดเร็ว

หน้านี้อธิบายดัชนีสองประเภทที่ Cloud Firestore ใช้ ได้แก่ ดัชนีแบบช่องเดียว และ ดัชนีรวม

ดัชนีที่อยู่เบื้องหลังทุกแบบสอบถาม

หากไม่มีดัชนีสำหรับการสืบค้น ฐานข้อมูลส่วนใหญ่จะรวบรวมข้อมูลผ่านรายการเนื้อหาทีละรายการ ซึ่งเป็นกระบวนการที่ช้าซึ่งจะช้าลงอีกเมื่อฐานข้อมูลเติบโตขึ้น Cloud Firestore รับประกันประสิทธิภาพการค้นหาในระดับสูงโดยใช้ดัชนีสำหรับการค้นหา ทั้งหมด ด้วยเหตุนี้ ประสิทธิภาพการสืบค้นจึงขึ้นอยู่กับขนาดของชุดผลลัพธ์ ไม่ใช่จำนวนรายการในฐานข้อมูล

การจัดการดัชนีน้อยลง การพัฒนาแอปมากขึ้น

Cloud Firestore มีฟีเจอร์ที่ช่วยลดระยะเวลาที่คุณต้องใช้ในการจัดการดัชนี ดัชนีที่จำเป็นสำหรับการสืบค้นขั้นพื้นฐานที่สุดจะถูกสร้างขึ้นสำหรับคุณโดยอัตโนมัติ ในขณะที่คุณใช้และทดสอบแอป Cloud Firestore จะช่วยคุณระบุและ สร้างดัชนีเพิ่มเติมที่ แอปของคุณต้องการ

ประเภทดัชนี

Cloud Firestore ใช้ดัชนี 2 ประเภท: ช่องเดียว และ คอมโพสิต นอกจากจำนวนฟิลด์ที่จัดทำดัชนีแล้ว ดัชนีฟิลด์เดี่ยวและดัชนีรวมยังแตกต่างกันไปตามวิธีการจัดการของคุณ

ดัชนีฟิลด์เดียว

ดัชนีเขตข้อมูลเดียวจะจัดเก็บการแมปที่เรียงลำดับของเอกสารทั้งหมดในคอลเลกชันที่มีเขตข้อมูลเฉพาะ แต่ละรายการในดัชนีเขตข้อมูลเดียวจะบันทึกค่าของเอกสารสำหรับเขตข้อมูลเฉพาะและตำแหน่งของเอกสารในฐานข้อมูล Cloud Firestore ใช้ดัชนีเหล่านี้เพื่อดำเนินการค้นหาพื้นฐานหลายอย่าง คุณจัดการดัชนีแบบฟิลด์เดียวโดยกำหนดการตั้งค่าการจัดทำดัชนีอัตโนมัติของฐานข้อมูลและการยกเว้นดัชนี

การจัดทำดัชนีอัตโนมัติ

ตามค่าเริ่มต้น Cloud Firestore จะรักษาดัชนีช่องเดียวสำหรับแต่ละช่องในเอกสารและแต่ละช่องย่อยในแผนที่โดยอัตโนมัติ Cloud Firestore ใช้การตั้งค่าเริ่มต้นต่อไปนี้สำหรับดัชนีช่องเดียว:

  • สำหรับแต่ละฟิลด์ที่ไม่ใช่อาร์เรย์และไม่ใช่แมป Cloud Firestore จะกำหนดดัชนีฟิลด์เดียว ในขอบเขตคอลเลกชัน สองดัชนี ดัชนีหนึ่งอยู่ในโหมดจากน้อยไปหามาก และอีกดัชนีหนึ่งอยู่ในโหมดจากมากไปน้อย

  • สำหรับแต่ละช่องแผนที่ Cloud Firestore จะสร้างสิ่งต่อไปนี้:

    • ดัชนีจากน้อยไปหามากขอบเขตการรวบรวมหนึ่งรายการสำหรับแต่ละฟิลด์ย่อยที่ไม่ใช่อาร์เรย์และไม่ใช่แมป
    • ดัชนีจากมากไปน้อยในขอบเขตคอลเลกชันหนึ่งรายการสำหรับแต่ละฟิลด์ย่อยที่ไม่ใช่อาร์เรย์และไม่ใช่แมป
    • ดัชนีอาร์เรย์ขอบเขตคอลเลกชันหนึ่งรายการประกอบด้วยดัชนีสำหรับแต่ละฟิลด์ย่อยของอาร์เรย์
    • Cloud Firestore จัดทำดัชนีแต่ละฟิลด์ย่อยของแผนที่แบบวนซ้ำ
  • สำหรับแต่ละช่องอาร์เรย์ในเอกสาร Cloud Firestore จะสร้างและดูแลรักษาดัชนีที่ประกอบด้วยอาร์เรย์ในขอบเขตคอลเลกชัน

  • ดัชนีเขตข้อมูลเดี่ยวที่มีขอบเขตกลุ่มคอลเลกชันจะไม่ถูกรักษาไว้ตามค่าเริ่มต้น

การยกเว้นดัชนีช่องเดียว

คุณสามารถยกเว้นช่องจากการตั้งค่า การจัดทำดัชนีอัตโนมัติได้ โดยการสร้างการยกเว้นดัชนีช่องเดียว การยกเว้นการทำดัชนีจะแทนที่การตั้งค่าดัชนีอัตโนมัติทั้งฐานข้อมูล การยกเว้นสามารถเปิดใช้งานดัชนีฟิลด์เดียวที่การตั้งค่าการจัดทำดัชนีอัตโนมัติของคุณจะปิดใช้งานหรือปิดใช้งานดัชนีฟิลด์เดียวที่การจัดทำดัชนีอัตโนมัติจะเปิดใช้งาน สำหรับกรณีที่การยกเว้นอาจเป็นประโยชน์ โปรดดู แนวทางปฏิบัติที่ดีที่สุดในการจัดทำดัชนี

ใช้ค่าพาธของฟิลด์ * เพื่อเพิ่มการยกเว้นดัชนีระดับคอลเลกชันในทุกฟิลด์ในกลุ่มคอลเลกชัน ตัวอย่างเช่น สำหรับ comments ของกลุ่มคอลเลกชัน ให้ตั้งค่าพาธของฟิลด์เป็น * เพื่อให้ตรงกับฟิลด์ทั้งหมดในกลุ่มการรวบรวม comments และปิดใช้งานการสร้างดัชนีของฟิลด์ทั้งหมดภายใต้กลุ่มการรวบรวม จากนั้นคุณสามารถเพิ่มการยกเว้นเพื่อสร้างดัชนีเฉพาะฟิลด์ที่จำเป็นสำหรับการสืบค้นของคุณ การลดจำนวนฟิลด์ที่จัดทำดัชนีจะช่วยลดต้นทุนการจัดเก็บข้อมูลและสามารถปรับปรุงประสิทธิภาพการเขียนได้

หากคุณสร้างการยกเว้นดัชนีฟิลด์เดียวสำหรับฟิลด์แผนที่ ฟิลด์ย่อยของแผนที่จะสืบทอดการตั้งค่าเหล่านั้น อย่างไรก็ตาม คุณสามารถกำหนดการยกเว้นดัชนีฟิลด์เดียวสำหรับฟิลด์ย่อยเฉพาะได้ หากคุณลบการยกเว้นสำหรับฟิลด์ย่อย ฟิลด์ย่อยจะสืบทอดการตั้งค่าการยกเว้นของพาเรนต์ หากมีอยู่ หรือการตั้งค่าทั่วทั้งฐานข้อมูลหากไม่มีการยกเว้นพาเรนต์

หากต้องการสร้างและจัดการการยกเว้นดัชนีช่องเดียว โปรดดูที่ การจัดการดัชนีใน Cloud Firestore

ดัชนีคอมโพสิต

ดัชนีผสมจะจัดเก็บการแมปที่เรียงลำดับของเอกสารทั้งหมดในคอลเลกชัน โดยอิงตามรายการฟิลด์ที่เรียงลำดับเพื่อทำดัชนี

Cloud Firestore ใช้ดัชนีผสมเพื่อรองรับคำค้นหาที่ดัชนีช่องเดียวไม่รองรับ

Cloud Firestore จะไม่สร้างดัชนีผสมโดยอัตโนมัติเหมือนกับที่สร้างสำหรับดัชนีช่องเดียว เนื่องจากมีการรวมช่องที่เป็นไปได้จำนวนมาก แต่ Cloud Firestore จะช่วยคุณ ระบุและสร้างดัชนีคอมโพสิตที่จำเป็น ในขณะที่คุณสร้างแอปแทน

หากคุณพยายามค้นหาด้านบนโดยไม่สร้างดัชนีที่ต้องการก่อน Cloud Firestore จะแสดงข้อความแสดงข้อผิดพลาดที่มีลิงก์ที่คุณสามารถติดตามเพื่อสร้างดัชนีที่ขาดหายไป สิ่งนี้จะเกิดขึ้นทุกครั้งที่คุณพยายามสืบค้นข้อมูลที่ไม่รองรับโดยดัชนี คุณยังสามารถกำหนดและจัดการดัชนีคอมโพสิตได้ด้วยตนเองโดยใช้คอนโซลหรือโดยใช้ Firebase CLI สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการสร้างและการจัดการดัชนีคอมโพสิต โปรดดูที่ การจัดการดัชนี

โหมดดัชนีและขอบเขตการสืบค้น

คุณกำหนดค่าดัชนีช่องเดียวและดัชนีรวมแตกต่างกัน แต่ทั้งสองอย่างจำเป็นต้องให้คุณกำหนดค่าโหมดดัชนีและขอบเขตการสืบค้นสำหรับดัชนีของคุณ

โหมดดัชนี

เมื่อคุณกำหนดดัชนี คุณจะเลือกโหมดดัชนีสำหรับแต่ละฟิลด์ที่ทำดัชนี โหมดดัชนีของแต่ละฟิลด์รองรับส่วนคำสั่งแบบสอบถามเฉพาะในฟิลด์นั้น คุณสามารถเลือกจากโหมดดัชนีต่อไปนี้:

โหมดดัชนี คำอธิบาย
จากน้อยไปมาก รองรับ < , <= , == , >= , > , != , in และ not-in ส่วนคำสั่งแบบสอบถามบนฟิลด์ และสนับสนุนการเรียงลำดับผลลัพธ์จากน้อยไปมากตามค่าฟิลด์นี้
จากมากไปน้อย รองรับ < , <= , == , >= , > , != , in และส่วนคำสั่งแบบสอบถาม not-in ในเขตข้อมูล และสนับสนุนการเรียงลำดับผลลัพธ์จากมากไปน้อยโดยยึดตามค่าของเขตข้อมูลนี้
อาร์เรย์ประกอบด้วย รองรับ array-contains และ array-contains-any ในฟิลด์

ขอบเขตการค้นหา

แต่ละดัชนีมีการกำหนดขอบเขตเป็นคอลเลกชันหรือกลุ่มคอลเลกชัน สิ่งนี้เรียกว่าขอบเขตการค้นหาของดัชนี:

ขอบเขตการรวบรวม
Cloud Firestore สร้างดัชนีที่มีขอบเขตการรวบรวมตามค่าเริ่มต้น ดัชนีเหล่านี้สนับสนุนการสืบค้นที่ส่งคืนผลลัพธ์จากคอลเลกชันเดียว

ขอบเขตกลุ่มคอลเลกชัน
กลุ่มคอลเลกชันประกอบด้วยคอลเลกชันทั้งหมดที่มีรหัสคอลเลกชันเดียวกัน เมื่อต้องการเรียกใช้ แบบสอบถามกลุ่มคอลเลก ชันที่ส่งคืนผลลัพธ์ที่กรองหรือเรียงลำดับจากกลุ่มคอลเลกชัน คุณต้องสร้างดัชนีที่สอดคล้องกับขอบเขตของกลุ่มคอลเลกชัน

ลำดับเริ่มต้นและฟิลด์ __name__

นอกเหนือจากการจัดเรียงเอกสารตามโหมดดัชนีที่ระบุสำหรับแต่ละฟิลด์ (จากน้อยไปหามากหรือจากมากไปน้อย) แล้ว ดัชนียังใช้การเรียงลำดับขั้นสุดท้ายตามฟิลด์ __name__ ของแต่ละเอกสาร ค่าของฟิลด์ __name__ ถูกตั้งค่าเป็นเส้นทางเอกสารแบบเต็ม ซึ่งหมายความว่าเอกสารในชุดผลลัพธ์ที่มีค่าฟิลด์เดียวกันจะถูกจัดเรียงตามเส้นทางเอกสาร

ตามค่าเริ่มต้น ฟิลด์ __name__ จะถูกจัดเรียงในทิศทางเดียวกันกับฟิลด์ที่เรียงลำดับล่าสุดในคำจำกัดความของดัชนี ตัวอย่างเช่น:

ของสะสม ฟิลด์ที่จัดทำดัชนีแล้ว ขอบเขตการค้นหา
เมืองต่างๆ ชื่อ , __name__ ของสะสม
เมืองต่างๆ สถานะ , __name__ ของสะสม
เมืองต่างๆ ประเทศ, ประชากร, __name__ ของสะสม

หากต้องการจัดเรียงผลลัพธ์ตามทิศทาง __name__ ที่ไม่ใช่ค่าเริ่มต้น คุณต้องสร้างดัชนีนั้น

ตัวอย่างการจัดทำดัชนี

ด้วยการสร้างดัชนีช่องเดียวให้คุณโดยอัตโนมัติ 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()

รายการดัชนี

ดัชนีที่กำหนดค่าของโปรเจ็กต์ของคุณและโครงสร้างของเอกสารจะกำหนดจำนวนรายการดัชนีสำหรับเอกสาร รายการดัชนีนับรวมใน ขีดจำกัดการนับรายการดัชนี

ตัวอย่างต่อไปนี้แสดงรายการดัชนีของเอกสาร

เอกสาร

/cities/SF

city_name : "San Francisco"
temperatures : {summer: 67, winter: 55}
neighborhoods : ["Mission", "Downtown", "Marina"]

ดัชนีสนามเดียว

  • เมือง_ชื่อ ASC
  • เมือง_ชื่อ DESC
  • อุณหภูมิ ฤดูร้อน ASC
  • อุณหภูมิฤดูร้อน DESC
  • อุณหภูมิฤดูหนาว ASC
  • อุณหภูมิฤดูหนาว DESC
  • Array ประกอบด้วย (ASC และ DESC)

ดัชนีคอมโพสิต

  • city_name ASC ย่าน ARRAY
  • city_name DESC ย่าน ARRAY

รายการดัชนี

การกำหนดค่าการทำดัชนีนี้ส่งผลให้มีรายการดัชนี 18 รายการต่อไปนี้สำหรับเอกสาร:

ดัชนี ข้อมูลที่จัดทำดัชนี
รายการดัชนีฟิลด์เดียว
เมือง_ชื่อ ASC city_name: "ซานฟรานซิสโก"
เมือง_ชื่อ DESC city_name: "ซานฟรานซิสโก"
อุณหภูมิ ฤดูร้อน ASC อุณหภูมิฤดูร้อน: 67
อุณหภูมิฤดูร้อน DESC อุณหภูมิฤดูร้อน: 67
อุณหภูมิฤดูหนาว ASC อุณหภูมิฤดูหนาว: 55
อุณหภูมิฤดูหนาว DESC อุณหภูมิฤดูหนาว: 55
อาร์เรย์ละแวกใกล้เคียงประกอบด้วย ASC บริเวณใกล้เคียง: "ภารกิจ"
อาร์เรย์ละแวกใกล้เคียงประกอบด้วย DESC บริเวณใกล้เคียง: "ภารกิจ"
อาร์เรย์ละแวกใกล้เคียงประกอบด้วย ASC บริเวณใกล้เคียง: "ตัวเมือง"
อาร์เรย์ละแวกใกล้เคียงประกอบด้วย DESC บริเวณใกล้เคียง: "ตัวเมือง"
อาร์เรย์ละแวกใกล้เคียงประกอบด้วย ASC ย่านใกล้เคียง: "มารีน่า"
อาร์เรย์ละแวกใกล้เคียงประกอบด้วย DESC ย่านใกล้เคียง: "มารีน่า"
รายการดัชนีคอมโพสิต
city_name ASC ย่าน ARRAY city_name: "ซานฟรานซิสโก" ย่านใกล้เคียง: "ภารกิจ"
city_name ASC ย่าน ARRAY city_name: "ซานฟรานซิสโก" ย่านใกล้เคียง: "ตัวเมือง"
city_name ASC ย่าน ARRAY city_name: "ซานฟรานซิสโก" ย่านใกล้เคียง: "มารีน่า"
city_name DESC ย่าน ARRAY city_name: "ซานฟรานซิสโก" ย่านใกล้เคียง: "ภารกิจ"
city_name DESC ย่าน ARRAY city_name: "ซานฟรานซิสโก" ย่านใกล้เคียง: "ตัวเมือง"
city_name DESC ย่าน ARRAY city_name: "ซานฟรานซิสโก" ย่านใกล้เคียง: "มารีน่า"

ดัชนีและราคา

ดัชนีจะส่งผลต่อ ต้นทุนการจัดเก็บ แอปพลิเคชันของคุณ หากต้องการข้อมูลเพิ่มเติมเกี่ยวกับวิธีการคำนวณขนาดพื้นที่เก็บข้อมูลสำหรับดัชนี โปรดดู ขนาดรายการดัชนี

การใช้ประโยชน์จากการรวมดัชนี

แม้ว่า Cloud Firestore จะใช้ดัชนีสำหรับทุกๆ การค้นหา แต่ก็ไม่จำเป็นต้องมี 1 ดัชนีต่อการค้นหา สำหรับการสืบค้นที่มีส่วนคำสั่งความเท่าเทียมกันหลายรายการ ( == ) และส่วนคำสั่ง 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")

ขีดจำกัดการจัดทำดัชนี

ขีดจำกัดต่อไปนี้ใช้กับดัชนี สำหรับโควต้าและขีดจำกัดทั้งหมด โปรดดูที่ โควต้าและขีดจำกัด

ขีดจำกัด รายละเอียด
จำนวนดัชนีรวมสูงสุดสำหรับฐานข้อมูล
จำนวนการกำหนดค่าฟิลด์เดียวสูงสุดสำหรับฐานข้อมูล

การกำหนดค่าระดับฟิลด์หนึ่งรายการสามารถมีการกำหนดค่าได้หลายรายการสำหรับฟิลด์เดียวกัน ตัวอย่างเช่น การยกเว้นการจัดทำดัชนีช่องเดียวและนโยบาย TTL บนช่องเดียวกันจะนับเป็นการกำหนดค่าช่องเดียวจนเกินขีดจำกัด

จำนวนรายการดัชนีสูงสุดสำหรับแต่ละเอกสาร

40,000

จำนวนรายการดัชนีคือผลรวมของข้อมูลต่อไปนี้สำหรับเอกสาร:

  • จำนวนรายการดัชนีฟิลด์เดียว
  • จำนวนรายการดัชนีผสม

หากต้องการดูว่า Cloud Firestore เปลี่ยนเอกสารและชุดดัชนีเป็นรายการดัชนีอย่างไร โปรดดู ตัวอย่างการนับรายการดัชนีนี้

จำนวนฟิลด์สูงสุดในดัชนีผสม 100
ขนาดสูงสุดของรายการดัชนี

7.5 กิโลไบต์

หากต้องการดูว่า Cloud Firestore คำนวณขนาดรายการดัชนีอย่างไร โปรดดู ขนาดรายการดัชนี

ผลรวมสูงสุดของขนาดของรายการดัชนีของเอกสาร

8 มิ.ย

ขนาดรวมคือผลรวมของเอกสารต่อไปนี้:

  • ผลรวมของขนาดของรายการดัชนีฟิลด์เดียวของเอกสาร
  • ผลรวมของขนาดของรายการดัชนีผสมของเอกสาร
  • ขนาดสูงสุดของค่าฟิลด์ที่จัดทำดัชนี

    1,500 ไบต์

    ค่าฟิลด์ที่เกิน 1,500 ไบต์จะถูกตัดทอน การสืบค้นที่เกี่ยวข้องกับค่าฟิลด์ที่ถูกตัดทอนอาจส่งกลับผลลัพธ์ที่ไม่สอดคล้องกัน

    การจัดทำดัชนีแนวทางปฏิบัติที่ดีที่สุด

    สำหรับแอปส่วนใหญ่ คุณสามารถใช้การจัดทำดัชนีอัตโนมัติและลิงก์ข้อความแสดงข้อผิดพลาดเพื่อจัดการดัชนีของคุณได้ อย่างไรก็ตาม คุณอาจต้องการเพิ่มการยกเว้นฟิลด์เดียวในกรณีต่อไปนี้:

    กรณี คำอธิบาย
    ฟิลด์สตริงขนาดใหญ่

    หากคุณมีเขตข้อมูลสตริงที่มักจะเก็บค่าสตริงยาวที่คุณไม่ได้ใช้สำหรับการสอบถาม คุณสามารถลดต้นทุนพื้นที่จัดเก็บได้โดยการยกเว้นเขตข้อมูลจากการจัดทำดัชนี

    อัตราการเขียนสูงในคอลเลกชันที่มีเอกสารที่มีค่าตามลำดับ

    หากคุณจัดทำดัชนีฟิลด์ที่เพิ่มขึ้นหรือลดลงตามลำดับระหว่างเอกสารในคอลเลกชัน เช่น การประทับเวลา อัตราการเขียนสูงสุดในคอลเลกชันคือ 500 การเขียนต่อวินาที หากคุณไม่ค้นหาตามฟิลด์ที่มีค่าตามลำดับ คุณสามารถยกเว้นฟิลด์นั้นจากการจัดทำดัชนีเพื่อข้ามขีดจำกัดนี้ได้

    ในกรณีการใช้งาน IoT ที่มีอัตราการเขียนสูง คอลเลกชันที่มีเอกสารที่มีฟิลด์การประทับเวลาอาจเข้าใกล้ขีดจำกัดการเขียน 500 รายการต่อวินาที

    ฟิลด์ TTL

    หากคุณใช้ นโยบาย TTL (time-to-live) โปรดทราบว่าช่อง TTL จะต้องเป็นการประทับเวลา การจัดทำดัชนีในช่อง TTL จะถูกเปิดใช้งานตามค่าเริ่มต้น และอาจส่งผลต่อประสิทธิภาพที่อัตราการรับส่งข้อมูลที่สูงขึ้น ตามแนวทางปฏิบัติที่ดีที่สุด ให้เพิ่มการยกเว้นช่องเดียวสำหรับช่อง TTL ของคุณ

    อาร์เรย์หรือฟิลด์แผนที่ขนาดใหญ่

    ช่องอาร์เรย์หรือแผนที่ขนาดใหญ่อาจมีรายการดัชนีถึงขีดจำกัด 40,000 รายการต่อเอกสาร หากคุณไม่ได้สืบค้นตามอาร์เรย์หรือฟิลด์แผนที่ขนาดใหญ่ คุณควรยกเว้นจากการจัดทำดัชนี

    สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีแก้ไขปัญหาการจัดทำดัชนี (Fanout ของดัชนี ข้อผิดพลาด INVALID_ARGUMENT ) โปรดดู หน้าการแก้ปัญหา