Catch up on highlights from Firebase at Google I/O 2023. Learn more

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

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

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

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

โหมดดัชนี

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

โหมดดัชนี คำอธิบาย
จากน้อยไปมาก รองรับ < , <= , == , >= , > , != , in , และ not-in , query clause บนฟิลด์ และรองรับผลการเรียงลำดับจากน้อยไปหามากตามค่าของฟิลด์นี้
จากมากไปน้อย รองรับ < , <= , == , >= , > , != , in และ not-in query clause บนฟิลด์ และรองรับผลการเรียงลำดับจากมากไปน้อยตามค่าของฟิลด์นี้
Array- ประกอบด้วย รองรับ 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"]

ดัชนีเขตข้อมูลเดียว

  • city_name ASC
  • city_name DESC
  • อุณหภูมิ.ฤดูร้อน ASC
  • อุณหภูมิ ฤดูร้อน DESC
  • อุณหภูมิ.ฤดูหนาว ASC
  • อุณหภูมิ ฤดูหนาว DESC
  • ย่านใกล้เคียง Array ประกอบด้วย (ASC และ DESC)

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

  • city_name ASC ละแวกใกล้เคียง ARRAY
  • city_name DESC ละแวกใกล้เคียง ARRAY

รายการดัชนี

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

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

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

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

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

แม้ว่า 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

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

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

40,000

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

  • จำนวนรายการดัชนีเขตข้อมูลเดียว
  • จำนวนรายการดัชนีผสม

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

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

7.5 กิโลไบต์

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

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

8 มิบ

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

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

    1500 ไบต์

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

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

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

    กรณี คำอธิบาย
    เขตข้อมูลสตริงขนาดใหญ่

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

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

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

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

    เขตข้อมูล TTL

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

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

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

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