ดัชนีเป็นปัจจัยสําคัญในประสิทธิภาพของฐานข้อมูล ดัชนีฐานข้อมูลจะเชื่อมโยงรายการในฐานข้อมูลกับตําแหน่งในฐานข้อมูล เช่นเดียวกับดัชนีหนังสือที่เชื่อมโยงหัวข้อในหนังสือกับหมายเลขหน้า เมื่อคุณค้นหาฐานข้อมูล ฐานข้อมูลจะใช้ดัชนีเพื่อระบุตำแหน่งของรายการที่คุณขอได้อย่างรวดเร็ว
หน้านี้อธิบายดัชนี 2 ประเภทที่ Cloud Firestore ใช้ ได้แก่ ดัชนีช่องเดียวและดัชนีผสม
คําจํากัดความและโครงสร้างดัชนี
ดัชนีจะกำหนดในรายการช่องของเอกสารหนึ่งๆ โดยมีโหมดดัชนีที่สอดคล้องกันสำหรับแต่ละช่อง
ดัชนีมีรายการสําหรับทุกช่องที่มีชื่ออยู่ในคําจํากัดความของดัชนี ดัชนีจะรวมเอกสารทั้งหมดที่อาจเป็นผลการค้นหาสําหรับคําค้นหาตามดัชนี เอกสารจะรวมอยู่ในดัชนีก็ต่อเมื่อมีการตั้งค่าค่าที่จัดทําดัชนีสําหรับทุกช่องที่ใช้ในดัชนี หากคําจํากัดความดัชนีอ้างอิงถึงช่องที่เอกสารไม่ได้ตั้งค่าค่าไว้ เอกสารนั้นจะไม่ปรากฏในดัชนี ในกรณีนี้ ระบบจะไม่แสดงเอกสารเป็นผลการค้นหาสำหรับคำค้นหาใดๆ ตามดัชนี
ระบบจะจัดเรียงดัชนีคอมโพสิตตามค่าช่องตามลำดับที่ระบุไว้ในคำจำกัดความของดัชนี
ดัชนีที่อยู่เบื้องหลังการค้นหาแต่ละครั้ง
หากไม่มีดัชนีสําหรับการค้นหา ฐานข้อมูลส่วนใหญ่จะทำการ Crawl เนื้อหาทีละรายการ ซึ่งเป็นกระบวนการที่ช้าและยิ่งช้าลงเมื่อฐานข้อมูลมีขนาดใหญ่ขึ้น Cloud Firestore รับประกันประสิทธิภาพการค้นหาที่สูงโดยใช้ดัชนีสําหรับการค้นหาทั้งหมด ด้วยเหตุนี้ ประสิทธิภาพการค้นหาจึงขึ้นอยู่กับขนาดของชุดผลลัพธ์ ไม่ใช่จำนวนรายการในฐานข้อมูล
จัดการดัชนีน้อยลง พัฒนาแอปมากขึ้น
Cloud Firestore มีฟีเจอร์ที่ช่วยให้คุณจัดการดัชนีได้เร็วขึ้น ระบบจะสร้างดัชนีที่จําเป็นสําหรับการค้นหาพื้นฐานที่สุดให้คุณโดยอัตโนมัติ ขณะใช้และทดสอบแอป Cloud Firestoreจะช่วยคุณระบุและสร้างดัชนีเพิ่มเติมที่แอปของคุณต้องใช้
ประเภทดัชนี
Cloud Firestore ใช้ดัชนี 2 ประเภท ได้แก่ ช่องเดียวและแบบผสม นอกจากจำนวนช่องที่จัดทําดัชนีแล้ว ดัชนีแบบช่องเดียวและดัชนีผสมยังมีวิธีจัดการที่แตกต่างกันด้วย
ดัชนีแบบช่องเดียว
ดัชนีแบบช่องเดียวจะจัดเก็บการแมปที่เรียงลำดับของเอกสารทั้งหมดในคอลเล็กชันที่มีช่องหนึ่งๆ รายการแต่ละรายการในดัชนีแบบช่องเดียวจะบันทึกค่าของเอกสารสำหรับช่องที่เฉพาะเจาะจงและตำแหน่งของเอกสารในฐานข้อมูล Cloud Firestore ใช้ดัชนีเหล่านี้เพื่อทำการค้นหาพื้นฐานหลายรายการ คุณจัดการดัชนีช่องเดี่ยวได้โดยการกำหนดค่าการตั้งค่าการจัดทําดัชนีอัตโนมัติและการยกเว้นดัชนีของฐานข้อมูล
การจัดทำดัชนีอัตโนมัติ
โดยค่าเริ่มต้น Cloud Firestore จะดูแลรักษาดัชนีแบบช่องเดียวโดยอัตโนมัติสำหรับแต่ละช่องในเอกสารและแต่ละช่องย่อยในแผนที่ Cloud Firestore ใช้การตั้งค่าเริ่มต้นต่อไปนี้สำหรับดัชนีแบบช่องเดียว
สําหรับช่องที่ไม่ใช่อาร์เรย์และไม่ใช่แผนที่แต่ละช่อง Cloud Firestore จะกําหนดดัชนีช่องเดี่ยวระดับคอลเล็กชัน 2 รายการ โดย 1 รายการเป็นโหมดจากน้อยไปมาก และอีก 1 รายการเป็นโหมดจากมากไปน้อย
Cloud Firestore จะสร้างสิ่งต่อไปนี้สําหรับแต่ละช่องแผนที่
- ดัชนีแบบขึ้นตามลําดับระดับคอลเล็กชัน 1 รายการสําหรับแต่ละช่องย่อยที่ไม่ใช่อาร์เรย์และไม่ใช่แผนที่
- ดัชนีตามลําดับจากน้อยไปมากระดับคอลเล็กชัน 1 รายการสําหรับแต่ละช่องย่อยที่ไม่ใช่อาร์เรย์และไม่ใช่แผนที่
- อาร์เรย์ระดับคอลเล็กชัน 1 รายการที่มีดัชนีสำหรับแต่ละช่องย่อยของอาร์เรย์
- Cloud Firestore จัดทำดัชนีช่องย่อยของแผนที่แต่ละช่องแบบซ้ำ
สําหรับช่องอาร์เรย์แต่ละช่องในเอกสาร Cloud Firestore จะสร้างและดูแลรักษาดัชนีที่มีอาร์เรย์ระดับคอลเล็กชัน
ระบบจะไม่ดูแลรักษาดัชนีแบบช่องเดียวที่มีขอบเขตกลุ่มคอลเล็กชันโดยค่าเริ่มต้น
การยกเว้นดัชนีช่องเดียว
คุณสามารถยกเว้นช่องจากการตั้งค่าการจัดทําดัชนีอัตโนมัติได้โดยการยกเว้นดัชนีของช่องเดียว การยกเว้นการจัดทําดัชนีจะลบล้างการตั้งค่าดัชนีอัตโนมัติทั่วทั้งฐานข้อมูล การยกเว้นอาจเปิดใช้ดัชนีแบบช่องเดียวที่การตั้งค่าการจัดทําดัชนีอัตโนมัติจะปิดใช้ หรือปิดใช้ดัชนีแบบช่องเดียวที่การจัดทําดัชนีอัตโนมัติจะเปิดใช้ ในกรณีที่การยกเว้นอาจมีประโยชน์ โปรดดูแนวทางปฏิบัติแนะนำในการจัดทำดัชนี
ใช้ค่าเส้นทางฟิลด์ *
เพื่อเพิ่มการยกเว้นดัชนีระดับคอลเล็กชันในฟิลด์ทั้งหมดในกลุ่มคอลเล็กชัน เช่น สําหรับกลุ่มคอลเล็กชัน comments
ให้ตั้งค่าเส้นทางฟิลด์เป็น *
เพื่อจับคู่กับฟิลด์ทั้งหมดในกลุ่มคอลเล็กชัน comments
และปิดใช้การจัดทําดัชนีของฟิลด์ทั้งหมดในกลุ่มคอลเล็กชัน จากนั้นคุณสามารถเพิ่มการยกเว้นเพื่อจัดทำดัชนีเฉพาะช่องที่จำเป็นสำหรับการค้นหา การลดจํานวนช่องที่จัดทําดัชนีจะช่วยลดค่าใช้จ่ายในการจัดเก็บและอาจปรับปรุงประสิทธิภาพการเขียนได้
หากคุณสร้างการยกเว้นดัชนีช่องเดี่ยวสําหรับช่องแผนที่ ช่องย่อยของแผนที่จะรับการตั้งค่าเหล่านั้น อย่างไรก็ตาม คุณสามารถกำหนดการยกเว้นดัชนีฟิลด์เดียวสำหรับช่องย่อยที่ต้องการได้ หากคุณลบการยกเว้นสำหรับช่องย่อย ช่องย่อยจะรับช่วงการตั้งค่าการยกเว้นของช่องหลัก (หากมี) หรือการตั้งค่าทั้งฐานข้อมูลหากไม่มีช่องหลักที่ยกเว้น
หากต้องการสร้างและจัดการการยกเว้นดัชนีแบบช่องเดียว โปรดดูหัวข้อจัดการดัชนี
ดัชนีผสม
ดัชนีผสมจะจัดเก็บการแมปที่เรียงลําดับของเอกสารทั้งหมดในคอลเล็กชัน โดยอิงตามรายการช่องที่จัดเรียงเพื่อจัดทำดัชนี
Cloud Firestore ใช้ดัชนีผสมเพื่อรองรับการค้นหาที่ดัชนีช่องเดียวยังไม่รองรับ
Cloud Firestore จะไม่สร้างดัชนีผสมโดยอัตโนมัติเหมือนที่ทำกับดัชนีช่องเดียว เนื่องจากมีชุดค่าผสมของช่องที่เป็นไปได้เป็นจำนวนมาก แต่ Cloud Firestore จะช่วยคุณระบุและสร้างดัชนีคอมโพสิทที่จําเป็นขณะที่คุณสร้างแอป
เมื่อใดก็ตามที่คุณพยายามค้นหาที่ดัชนีไม่รองรับ Cloud Firestore จะแสดงข้อความแสดงข้อผิดพลาดพร้อมลิงก์ที่คุณสามารถใช้เพื่อสร้างดัชนีที่ขาดหายไป
นอกจากนี้ คุณยังกําหนดและจัดการดัชนีคอมโพสิตด้วยตนเองได้โดยใช้คอนโซลหรือ Firebase CLI ดูข้อมูลเพิ่มเติมเกี่ยวกับการสร้างและจัดการดัชนีคอมโพสิทได้ที่จัดการดัชนี
โหมดดัชนีและขอบเขตการค้นหา
คุณกําหนดค่าดัชนีแบบช่องเดียวและดัชนีผสมแตกต่างกัน แต่ทั้ง 2 ประเภทกําหนดให้คุณกําหนดค่าโหมดดัชนีและขอบเขตการค้นหาสําหรับดัชนี
โหมดดัชนี
เมื่อกําหนดดัชนี คุณจะเลือกโหมดดัชนีสําหรับฟิลด์ที่จัดทําดัชนีแต่ละฟิลด์ โหมดดัชนีของช่องแต่ละช่องรองรับคำสั่งการค้นหาที่เฉพาะเจาะจงในช่องนั้น คุณเลือกจากโหมดดัชนีต่อไปนี้ได้
โหมดดัชนี | คำอธิบาย |
---|---|
น้อยไปมาก | รองรับคำสั่งค้นหา < , <= , == , >= , > , != , in และ not-in ในช่อง และรองรับการจัดเรียงผลลัพธ์ตามลําดับจากน้อยไปมากตามค่าในช่องนี้ |
ลดลง | รองรับคำสั่งค้นหา < , <= , == , >= , > , != , in และ not-in ในช่อง และรองรับการจัดเรียงผลลัพธ์ตามลําดับจากมากไปน้อยตามค่าในช่องนี้ |
Array‑contains | รองรับคำสั่งค้นหา array-contains และ array-contains-any ในช่อง |
เวกเตอร์ | รองรับคำสั่งค้นหา FindNearest ในช่อง |
ขอบเขตการค้นหา
แต่ละดัชนีจะมีขอบเขตเป็นคอลเล็กชันหรือกลุ่มคอลเล็กชัน การดำเนินการนี้เรียกว่าขอบเขตการค้นหาของดัชนี
- ขอบเขตคอลเล็กชัน
- Cloud Firestore จะสร้างดัชนีที่มีขอบเขตของคอลเล็กชันโดยค่าเริ่มต้น ดัชนีเหล่านี้รองรับการค้นหาที่แสดงผลลัพธ์จากคอลเล็กชันเดียว
- ขอบเขตกลุ่มคอลเล็กชัน
- กลุ่มคอลเล็กชันประกอบด้วยคอลเล็กชันทั้งหมดที่มีรหัสคอลเล็กชันเดียวกัน หากต้องการเรียกใช้การค้นหากลุ่มคอลเล็กชันที่แสดงผลลัพธ์ที่กรองหรือจัดเรียงจากกลุ่มคอลเล็กชัน คุณต้องสร้างดัชนีที่เกี่ยวข้องซึ่งมีขอบเขตกลุ่มคอลเล็กชัน
การจัดเรียงเริ่มต้นและช่อง __name__
นอกจากการจัดเรียงเอกสารตามโหมดดัชนีที่ระบุสำหรับแต่ละช่อง (จากน้อยไปมากหรือจากมากไปน้อย) แล้ว ดัชนียังใช้การจัดเรียงขั้นสุดท้ายตามช่อง __name__
ของเอกสารแต่ละรายการด้วย ค่าของช่อง __name__
จะตั้งเป็นเส้นทางเอกสารแบบเต็ม ซึ่งหมายความว่าระบบจะจัดเรียงเอกสารในชุดผลลัพธ์ที่มีค่าช่องเดียวกันตามเส้นทางเอกสาร
โดยค่าเริ่มต้น ระบบจะจัดเรียงช่อง __name__
ในทิศทางเดียวกับช่องที่จัดเรียงล่าสุดในคําจํากัดความของดัชนี เช่น
การรวบรวม | ช่องที่จัดทำดัชนี | ขอบเขตการค้นหา |
---|---|---|
เมือง | __name__ |
ชื่อ การรวบรวม |
เมือง | __name__ |
state, การรวบรวม |
เมือง | __name__ |
ประเทศ, จำนวนประชากร, การรวบรวม |
หากต้องการจัดเรียงผลลัพธ์ตามลำดับ __name__
ที่ไม่ใช่ค่าเริ่มต้น คุณต้องสร้างดัชนีนั้น
พร็อพเพอร์ตี้ของดัชนี
ดัชนีที่ช่วยให้ดำเนินการค้นหาได้อย่างมีประสิทธิภาพมากที่สุดจะกำหนดโดยพร็อพเพอร์ตี้ต่อไปนี้
- ฟิลด์ที่ใช้ในตัวกรองแบบเท่ากับ
- ฟิลด์ที่ใช้ในลําดับการจัดเรียง
- ฟิลด์ที่ใช้ในตัวกรองช่วงและตัวกรองความไม่เท่ากัน (ซึ่งไม่ได้รวมอยู่ในลําดับการจัดเรียงอยู่แล้ว)
- ฟิลด์ที่ใช้ในการรวม (ซึ่งไม่ได้รวมอยู่ในลําดับการจัดเรียง ตัวกรองช่วง และตัวกรองความไม่เท่ากัน)
Cloud Firestore คํานวณผลลัพธ์สําหรับคําค้นหาดังนี้
- ระบุดัชนีที่สอดคล้องกับคอลเล็กชัน พร็อพเพอร์ตี้ตัวกรอง โอเปอเรเตอร์ตัวกรอง และลําดับการจัดเรียงของคําค้นหา
- ระบุตําแหน่งดัชนีที่การสแกนจะเริ่ม ตำแหน่งเริ่มต้นจะขึ้นต้นด้วยตัวกรองความเท่าเทียมของการค้นหา และลงท้ายด้วยตัวกรองช่วงและความไม่เท่าเทียมในช่อง
orderBy
แรก - เริ่มสแกนดัชนี โดยแสดงเอกสารแต่ละรายการที่ตรงกับตัวกรองทั้งหมดจนกว่ากระบวนการสแกนจะทำอย่างใดอย่างหนึ่งต่อไปนี้
- พบเอกสารที่ไม่เป็นไปตามเงื่อนไขตัวกรอง และยืนยันว่าเอกสารที่ตามมาจะไม่เป็นไปตามเงื่อนไขตัวกรองโดยสมบูรณ์
- มาถึงส่วนท้ายของดัชนี
- รวบรวมผลลัพธ์สูงสุดที่คำค้นหาขอ
ตัวอย่างการจัดทําดัชนี
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 จะอัปเดตดัชนีช่องเดียวแบบขึ้น 1 รายการต่อช่องที่ไม่ใช่อาร์เรย์ ดัชนีช่องเดียวแบบลง 1 รายการต่อช่องที่ไม่ใช่อาร์เรย์ และดัชนีช่องเดียวที่มีอาร์เรย์ 1 รายการสําหรับช่องอาร์เรย์ แต่ละแถวในตารางต่อไปนี้แสดงรายการในดัชนีแบบช่องเดียว
การรวบรวม | ช่องที่จัดทําดัชนีแล้ว | ขอบเขตการค้นหา |
---|---|---|
เมือง | ชื่อ | การรวบรวม |
เมือง | สถานะ | การรวบรวม |
เมือง | ประเทศ | การรวบรวม |
เมือง | เมืองหลวง | การรวบรวม |
เมือง | ประชากร | การรวบรวม |
เมือง | ชื่อ | การรวบรวม |
เมือง | สถานะ | การรวบรวม |
เมือง | ประเทศ | การรวบรวม |
เมือง | เมืองหลวง | การรวบรวม |
เมือง | ประชากร | การรวบรวม |
เมือง | 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")
การรวบรวม | ช่องที่จัดทำดัชนี | ขอบเขตการค้นหา |
---|---|---|
เมือง | ประเทศ, ประชากร | การรวบรวม |
cities | country, population | การรวบรวม |
เพื่อหลีกเลี่ยงการสูญเสียประสิทธิภาพที่เกิดจากการผสานดัชนี เราขอแนะนำให้คุณสร้างดัชนีคอมโพสิทเพื่อรวมการค้นหา 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)
การรวบรวม | ช่องที่จัดทำดัชนี | ขอบเขตการค้นหา |
---|---|---|
เมือง | แท็ก array-contains, | (หรือ ) ตัวพิมพ์ใหญ่การรวบรวม |
การค้นหาที่ดัชนีกลุ่มคอลเล็กชันรองรับ
หากต้องการสาธิตดัชนีที่มีขอบเขตกลุ่มคอลเล็กชัน ให้เพิ่ม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
- temperatures.summer ASC
- temperatures.summer DESC
- temperatures.winter ASC
- temperatures.winter DESC
- มีในอาร์เรย์ "neighborhoods" (ASC และ DESC)
ดัชนีผสม
- city_name ASC, neighborhoods ARRAY
- city_name DESC, neighborhoods ARRAY
รายการดัชนี
การกำหนดค่าการจัดทําดัชนีนี้ส่งผลให้รายการดัชนีสําหรับเอกสารมีดังนี้
ดัชนี | ข้อมูลที่จัดทำดัชนี |
---|---|
รายการดัชนีแบบช่องเดียว | |
city_name ASC | city_name: "San Francisco" |
city_name DESC | city_name: "San Francisco" |
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 มี ASC | ย่าน: "Mission" |
อาร์เรย์ neighborhoods มี DESC | ย่าน: "Mission" |
อาร์เรย์ neighborhoods มี ASC | ย่าน: "ดาวน์ทาวน์" |
อาร์เรย์ neighborhoods มี DESC | ย่าน: "ดาวน์ทาวน์" |
อาร์เรย์ neighborhoods มี ASC | ย่าน: "Marina" |
อาร์เรย์ neighborhoods มี DESC | ย่าน: "Marina" |
รายการดัชนีผสม | |
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" |
ดัชนีและราคา
ดัชนีจะเพิ่มค่าใช้จ่ายในการจัดเก็บข้อมูลของแอปพลิเคชัน ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีคำนวณขนาดพื้นที่เก็บข้อมูลสำหรับดัชนีได้ที่ขนาดรายการดัชนี
ใช้การผสานดัชนี
แม้ว่า Cloud Firestore จะใช้ดัชนีสําหรับการค้นหาทุกรายการ แต่ก็ไม่ได้จําเป็นต้องใช้ดัชนี 1 รายการต่อการค้นหา 1 รายการ สําหรับการค้นหาที่มีอนุประโยคความเท่าเทียม (==
) หลายรายการ และอนุประโยค orderBy
(ไม่บังคับ) Cloud Firestore จะใช้ดัชนีที่มีอยู่ซ้ำได้ Cloud Firestore สามารถผสานดัชนีสําหรับตัวกรองการเท่ากับแบบง่ายเพื่อสร้างดัชนีผสมที่จําเป็นสําหรับการค้นหาการเท่ากับขนาดใหญ่ขึ้น
คุณลดต้นทุนการจัดทําดัชนีได้โดยระบุกรณีที่สามารถใช้การผสานดัชนี ตัวอย่างเช่น ในคอลเล็กชัน restaurants
สําหรับแอปการให้คะแนนร้านอาหาร
ร้านอาหาร
แห่งburgerthyme
name : "Burger Thyme"
category : "burgers"
city : "San Francisco"
editors_pick : true
star_rating : 4
แอปนี้ใช้ข้อความค้นหาดังต่อไปนี้ แอปใช้ชุดค่าผสมของประโยคความเท่าสําหรับ category
, city
และ editors_pick
ขณะจัดเรียงตาม star_rating
แบบ ascending เสมอ
เว็บ
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")
คุณสามารถสร้างดัชนีสําหรับการค้นหาแต่ละรายการได้ ดังนี้
การรวบรวม | ช่องที่จัดทำดัชนี | ขอบเขตการค้นหา |
---|---|---|
ร้านอาหาร | category, star_rating | การรวบรวม |
ร้านอาหาร | city, star_rating | การรวบรวม |
ร้านอาหาร | category, city, star_rating | การรวบรวม |
ร้านอาหาร | category, city, editors_pick, star_rating | การรวบรวม |
วิธีที่ดีกว่าคือคุณสามารถลดจํานวนดัชนีได้โดยใช้ความสามารถของ Cloud Firestore ในการผสานดัชนีสําหรับประโยคสัมพัทธ์ที่เท่ากัน ดังนี้
การรวบรวม | ช่องที่จัดทำดัชนี | ขอบเขตการค้นหา |
---|---|---|
ร้านอาหาร | category, star_rating | การรวบรวม |
ร้านอาหาร | city, star_rating | การรวบรวม |
ร้านอาหาร | editors_pick, star_rating | การรวบรวม |
ชุดดัชนีนี้ไม่เพียงแต่จะเล็กกว่าเท่านั้น แต่ยังรองรับการค้นหาเพิ่มเติมด้วย
เว็บ
db.collection("restaurants").where("editors_pick", "==", true) .orderBy("star_rating")
ขีดจํากัดการจัดทำดัชนี
ขีดจํากัดต่อไปนี้มีผลกับดัชนี ดูข้อมูลเพิ่มเติมเกี่ยวกับโควต้าและขีดจำกัดได้ที่หัวข้อโควต้าและขีดจำกัด
ขีดจำกัด | รายละเอียด |
---|---|
จํานวนสูงสุดของดัชนีผสมสําหรับฐานข้อมูล |
|
จํานวนการกําหนดค่าฟิลด์เดียวสูงสุดสําหรับฐานข้อมูล |
การกําหนดค่าระดับฟิลด์ 1 รายการอาจมีการกำหนดค่าหลายรายการสําหรับฟิลด์เดียวกัน เช่น การยกเว้นการจัดทำดัชนีฟิลด์เดียวและนโยบาย TTL ในฟิลด์เดียวกันจะนับเป็นการกำหนดค่าฟิลด์ 1 รายการตามขีดจํากัด |
จำนวนรายการดัชนีสูงสุดสำหรับเอกสารแต่ละรายการ |
40,000 จํานวนรายการดัชนีคือผลรวมของรายการต่อไปนี้สําหรับเอกสาร
หากต้องการดูวิธีที่ Cloud Firestore เปลี่ยนเอกสารและชุดดัชนีให้เป็นรายการดัชนี โปรดดูตัวอย่างจำนวนรายการดัชนีนี้ |
จำนวนช่องสูงสุดในดัชนีผสม | 100 |
ขนาดสูงสุดของรายการดัชนี |
7.5 KiB หากต้องการดูวิธีที่ Cloud Firestore คํานวณขนาดรายการดัชนี โปรดดูขนาดรายการดัชนี |
ผลรวมสูงสุดของขนาดรายการดัชนีของเอกสาร |
8 MiB ขนาดทั้งหมดคือผลรวมของข้อมูลต่อไปนี้สำหรับเอกสาร |
ขนาดสูงสุดของค่าในช่องที่จัดทําดัชนี |
1,500 ไบต์ ระบบจะตัดค่าของช่องที่เกิน 1,500 ไบต์ให้สั้นลง การค้นหาที่เกี่ยวข้องกับค่าฟิลด์ที่ถูกตัดอาจแสดงผลลัพธ์ที่ไม่สอดคล้องกัน |
แนวทางปฏิบัติแนะนำในการจัดทำดัชนี
สําหรับแอปส่วนใหญ่ คุณสามารถใช้การจัดทำดัชนีอัตโนมัติและลิงก์ข้อความแสดงข้อผิดพลาดเพื่อจัดการดัชนีได้ อย่างไรก็ตาม คุณอาจต้องเพิ่มการยกเว้นช่องเดียวในกรณีต่อไปนี้
การก | คำอธิบาย |
---|---|
ช่องสตริงขนาดใหญ่ | หากมีฟิลด์สตริงที่มักเก็บค่าสตริงยาวๆ ที่คุณไม่ได้ใช้สำหรับค้นหา คุณสามารถลดค่าใช้จ่ายในการจัดเก็บได้โดยยกเว้นฟิลด์นั้นไม่ให้ได้รับการจัดทําดัชนี |
อัตราการเขียนสูงไปยังคอลเล็กชันที่มีเอกสารซึ่งมีค่าตามลำดับ | หากคุณจัดทำดัชนีช่องที่เพิ่มขึ้นหรือลดลงตามลำดับระหว่างเอกสารในคอลเล็กชัน เช่น การประทับเวลา อัตราเขียนสูงสุดไปยังคอลเล็กชันจะเป็น 500 ครั้งต่อวินาที หากไม่ได้ค้นหาตามช่องที่มีค่าตามลําดับ คุณสามารถยกเว้นช่องนั้นจากการจัดทำดัชนีเพื่อข้ามขีดจํากัดนี้ได้ ตัวอย่างเช่น ใน Use Case ของ IoT ที่มีอัตราการเขียนสูง คอลเล็กชันที่มีเอกสารซึ่งมีช่องการประทับเวลาอาจเข้าใกล้ขีดจํากัดการเขียน 500 ครั้งต่อวินาที |
ฟิลด์ TTL |
หากคุณใช้นโยบาย TTL (Time To Live) โปรดทราบว่าช่อง TTL ต้องเป็นการประทับเวลา ระบบจะเปิดใช้การจัดทำดัชนีในช่อง TTL โดยค่าเริ่มต้น ซึ่งอาจส่งผลต่อประสิทธิภาพเมื่ออัตราการเข้าชมสูงขึ้น แนวทางปฏิบัติแนะนำคือเพิ่มการยกเว้นช่องเดี่ยวสำหรับช่อง TTL |
ฟิลด์อาร์เรย์หรือแผนที่ขนาดใหญ่ | ฟิลด์อาร์เรย์หรือแผนที่ขนาดใหญ่อาจเข้าใกล้ขีดจํากัดของรายการดัชนี 40,000 รายการต่อเอกสาร หากคุณไม่ได้ค้นหาตามอาร์เรย์ขนาดใหญ่หรือฟิลด์แผนที่ คุณควรยกเว้นฟิลด์ดังกล่าวจากการจัดทำดัชนี |
หากคุณใช้การค้นหาที่มีโอเปอเรเตอร์ช่วงและโอเปอเรเตอร์ที่ไม่เท่ากันในหลายฟิลด์ โปรดดูข้อควรพิจารณาในการจัดทำดัชนีที่คุณควรพิจารณาเพื่อเพิ่มประสิทธิภาพและต้นทุนของการค้นหา Cloud Firestore
ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีแก้ปัญหาการจัดทําดัชนี (การแยกกลุ่มดัชนี ข้อผิดพลาด INVALID_ARGUMENT
) ได้ที่หน้าการแก้ปัญหา