ดัชนีเป็นปัจจัยสำคัญในประสิทธิภาพของฐานข้อมูล ดัชนีฐานข้อมูลจะเชื่อมโยงรายการในฐานข้อมูลกับตำแหน่งในฐานข้อมูล คล้ายกับดัชนีของหนังสือที่เชื่อมโยงหัวข้อในหนังสือกับหมายเลขหน้า เมื่อคุณค้นหาฐานข้อมูล ฐานข้อมูลจะใช้ดัชนีเพื่อระบุตำแหน่งของรายการที่คุณขอได้อย่างรวดเร็ว
หน้านี้อธิบายดัชนี 2 ประเภทที่ Cloud Firestore ใช้ ได้แก่ ดัชนีอัตโนมัติและดัชนีที่กำหนดเอง
คำจำกัดความและโครงสร้างของดัชนี
ดัชนีจะกำหนดไว้ในรายการฟิลด์ของเอกสารหนึ่งๆ โดยมีโหมดดัชนีที่สอดคล้องกันสำหรับแต่ละฟิลด์
ดัชนีจะมีรายการสำหรับทุกช่องที่ระบุชื่อไว้ในคำจำกัดความของดัชนี ดัชนีประกอบด้วยเอกสารทั้งหมดที่อาจเป็นผลลัพธ์สำหรับคำค้นหาที่อิงตามดัชนี เอกสารจะรวมอยู่ในดัชนีก็ต่อเมื่อมีค่าที่จัดทำดัชนีไว้สำหรับทุกช่องที่ใช้ในดัชนี หากคำจำกัดความของดัชนีอ้างอิงถึงช่องที่เอกสารไม่ได้ตั้งค่าไว้ เอกสารนั้นจะไม่ปรากฏในดัชนี ในกรณีนี้ ระบบจะไม่แสดงเอกสารเป็นผลการค้นหาสำหรับคำค้นหาใดๆ ที่อิงตามดัชนี
ดัชนีจะจัดเรียงตามค่าของช่องตามลำดับที่ระบุไว้ในคำจำกัดความของดัชนี
ดัชนีที่อยู่เบื้องหลังการค้นหาทุกครั้ง
หากไม่มีดัชนีสำหรับการค้นหา ฐานข้อมูลส่วนใหญ่จะทำการ Crawl เนื้อหาทีละรายการ ซึ่งเป็นกระบวนการที่ช้าและจะยิ่งช้าลงไปอีกเมื่อฐานข้อมูลมีขนาดใหญ่ขึ้น Cloud Firestore ช่วยให้การค้นหามีประสิทธิภาพสูงโดยใช้ดัชนีสำหรับคำค้นหาทั้งหมด ด้วยเหตุนี้ ประสิทธิภาพการค้นหาจึงขึ้นอยู่กับขนาดของชุดผลลัพธ์ ไม่ใช่จำนวนรายการในฐานข้อมูล
ลดการจัดการดัชนี เพิ่มการพัฒนาแอป
Cloud Firestore มีฟีเจอร์ที่ช่วยลดเวลาที่คุณต้องใช้ในการจัดการดัชนี ระบบจะสร้างดัชนีที่จำเป็นสำหรับการค้นหาพื้นฐานที่สุดให้คุณโดยอัตโนมัติ เมื่อคุณใช้และทดสอบแอป Cloud Firestore จะช่วยระบุและสร้างดัชนีเพิ่มเติมที่แอปของคุณต้องการ
ประเภทดัชนี
Cloud Firestore ใช้ดัชนี 2 ประเภท ได้แก่ อัตโนมัติและกำหนดเอง ดัชนีที่สร้างด้วยตนเองและดัชนีอัตโนมัติแตกต่างกันที่วิธีจัดการ
ดัชนีอัตโนมัติ
โดยค่าเริ่มต้น Cloud Firestore จะสร้างดัชนีสำหรับแต่ละฟิลด์ที่มีอยู่ในเอกสารในคอลเล็กชันโดยอัตโนมัติ ดัชนีแบบช่องเดียวเหล่านี้ช่วยให้คุณทำการค้นหาพื้นฐานได้หลายอย่าง คุณจัดการดัชนีอัตโนมัติได้โดยกำหนดการตั้งค่าการจัดทำดัชนีอัตโนมัติและการยกเว้นดัชนีของฐานข้อมูล
ค่าเริ่มต้นของดัชนีอัตโนมัติ
Cloud Firestore ใช้การตั้งค่าเริ่มต้นต่อไปนี้สำหรับดัชนีอัตโนมัติ
สำหรับช่องที่ไม่ใช่อาร์เรย์และไม่ใช่แผนที่ Cloud Firestore จะกำหนดดัชนีขอบเขตคอลเล็กชัน 2 รายการ โดยรายการหนึ่งอยู่ในโหมดจากน้อยไปมากและอีกรายการหนึ่งอยู่ในโหมดจากมากไปน้อย
Cloud Firestore จะสร้างสิ่งต่อไปนี้สำหรับช่องแผนที่แต่ละช่อง
- ดัชนีจากน้อยไปมากระดับคอลเล็กชัน 1 รายการสำหรับฟิลด์ย่อยที่ไม่ใช่อาร์เรย์และไม่ใช่แผนที่แต่ละรายการ
- ดัชนีจากมากไปน้อยระดับคอลเล็กชัน 1 รายการสำหรับช่องย่อยที่ไม่ใช่อาร์เรย์และไม่ใช่แผนที่แต่ละรายการ
- ดัชนีจากน้อยไปมากระดับคอลเล็กชัน 1 รายการสำหรับค่าแผนที่ทั้งหมด
- ดัชนีจากมากไปน้อยระดับคอลเล็กชัน 1 รายการสำหรับค่าแผนที่ทั้งหมด
- ดัชนี array-contains ระดับคอลเล็กชัน 1 รายการสำหรับฟิลด์ย่อยของอาร์เรย์แต่ละรายการ
- Cloud Firestore จะจัดทำดัชนีฟิลด์ย่อยของแผนที่แต่ละรายการซ้ำๆ
สำหรับช่องอาร์เรย์แต่ละช่องในเอกสาร Cloud Firestore จะสร้างสิ่งต่อไปนี้
- ดัชนีจากน้อยไปมาก 1 รายการในขอบเขตคอลเล็กชันสำหรับค่าอาร์เรย์ทั้งหมด
- ดัชนีจากมากไปน้อยระดับคอลเล็กชัน 1 รายการสำหรับค่าอาร์เรย์ทั้งหมด
- ดัชนี array-contains ระดับคอลเล็กชัน 1 รายการ
ระบบจะไม่ดูแลรักษาดัชนีอัตโนมัติที่มีขอบเขตกลุ่มคอลเล็กชันโดยค่าเริ่มต้น
การยกเว้นดัชนีอัตโนมัติ
คุณสามารถยกเว้นฟิลด์จากการตั้งค่าการจัดทำดัชนีอัตโนมัติได้โดยสร้างการยกเว้นการจัดทำดัชนี การยกเว้นการจัดทำดัชนีจะลบล้างการตั้งค่าดัชนีอัตโนมัติทั่วทั้งฐานข้อมูล การยกเว้นสามารถเปิดใช้ดัชนีที่การตั้งค่าการจัดทำดัชนีอัตโนมัติจะปิดใช้ หรือปิดใช้ดัชนีที่การจัดทำดัชนีอัตโนมัติจะเปิดใช้ ดูแนวทางปฏิบัติแนะนำในการจัดทำดัชนีสำหรับกรณีที่การยกเว้นอาจเป็นประโยชน์
ใช้ค่าเส้นทางฟิลด์ * เพื่อเพิ่มข้อยกเว้นดัชนีระดับคอลเล็กชันในฟิลด์ทั้งหมดในกลุ่มคอลเล็กชัน เช่น สำหรับกลุ่มคอลเล็กชัน comments ให้ตั้งค่าเส้นทางฟิลด์เป็น * เพื่อให้ตรงกับฟิลด์ทั้งหมดในกลุ่มคอลเล็กชัน comments และปิดใช้การจัดทำดัชนีของฟิลด์ทั้งหมดในกลุ่มคอลเล็กชัน จากนั้นคุณสามารถเพิ่มข้อยกเว้นเพื่อจัดทำดัชนีเฉพาะช่องที่จำเป็นสำหรับการค้นหา การลดจำนวนช่องที่จัดทำดัชนีจะช่วยลดค่าใช้จ่ายในการจัดเก็บและปรับปรุงประสิทธิภาพการเขียนได้
หากคุณสร้างข้อยกเว้นดัชนีสำหรับช่องแผนที่ ช่องย่อยของแผนที่จะรับการตั้งค่าเหล่านั้นมา อย่างไรก็ตาม คุณสามารถกำหนดข้อยกเว้นการจัดทำดัชนีสำหรับฟิลด์ย่อยที่เฉพาะเจาะจงได้ หากคุณลบการยกเว้นสำหรับฟิลด์ย่อย ฟิลด์ย่อยจะรับค่าการตั้งค่าการยกเว้นของฟิลด์หลัก (หากมี) หรือการตั้งค่าทั้งฐานข้อมูลหากไม่มีการยกเว้นของฟิลด์หลัก
หากต้องการสร้างและจัดการการยกเว้นดัชนีอัตโนมัติ โปรดดูหัวข้อจัดการดัชนี
ดัชนีที่สร้างด้วยตนเอง
ดัชนีที่สร้างด้วยตนเองจะจัดเก็บการแมปที่จัดเรียงของเอกสารทั้งหมดในคอลเล็กชัน โดยอิงตามรายการฟิลด์ที่เรียงลำดับเพื่อจัดทำดัชนี
Cloud Firestore ใช้ดัชนีที่กำหนดเองเพื่อรองรับการค้นหาที่ดัชนีอัตโนมัติยังไม่รองรับ
โดยค่าเริ่มต้น Cloud Firestore จะสร้างดัชนีช่องเดียวโดยอัตโนมัติสำหรับแต่ละช่องที่อยู่ในคอลเล็กชัน Cloud Firestore จะไม่สร้างดัชนีสำหรับการรวมฟิลด์โดยอัตโนมัติเนื่องจากมีการรวมฟิลด์ที่เป็นไปได้จำนวนมาก แต่ Cloud Firestore จะช่วยคุณระบุและสร้างดัชนีที่จำเป็นขณะสร้างแอปแทน
ทุกครั้งที่คุณพยายามค้นหาข้อมูลที่ดัชนีที่มีอยู่ไม่รองรับ Cloud Firestore จะแสดงข้อความแสดงข้อผิดพลาดพร้อมลิงก์ที่คุณสามารถใช้เพื่อสร้างดัชนีที่ขาดหายไป
นอกจากนี้ คุณยังกำหนดและจัดการดัชนีด้วยตนเองได้โดยใช้คอนโซลหรือใช้ Firebase CLI ดูข้อมูลเพิ่มเติมเกี่ยวกับการสร้างและจัดการดัชนีด้วยตนเองได้ที่หัวข้อจัดการดัชนี
โหมดดัชนีและขอบเขตการค้นหา
คุณกำหนดค่าดัชนีอัตโนมัติและดัชนีที่กำหนดเองแตกต่างกัน แต่ทั้ง 2 แบบกำหนดให้คุณต้องกำหนดค่าโหมดดัชนีและขอบเขตการค้นหาสำหรับดัชนี
โหมดดัชนี
เมื่อกำหนดดัชนี คุณจะต้องเลือกโหมดดัชนีสำหรับแต่ละช่องที่จัดทำดัชนี โหมดดัชนีของแต่ละช่องรองรับส่วนคำสั่งการค้นหาที่เฉพาะเจาะจงในช่องนั้น คุณเลือกโหมดดัชนีต่อไปนี้ได้
| โหมดดัชนี | คำอธิบาย |
|---|---|
| จากน้อยไปมาก | รองรับส่วนคำสั่งการค้นหา <, <=, ==, >=, >, !=, in และ not-in ในช่อง และรองรับการจัดเรียงผลลัพธ์ตามลำดับจากน้อยไปมากตามค่าของช่องนี้ |
| จากมากไปน้อย | รองรับส่วนคำสั่งการค้นหา <, <=, ==, >=, >, !=, in และ not-in ในช่อง และรองรับการจัดเรียงผลลัพธ์จากมากไปน้อยตามค่าของช่องนี้ |
| Array‑contains | รองรับส่วนคำสั่งการค้นหา array-contains และ array-contains-any ในช่อง |
| Vector | รองรับส่วนคำสั่งการค้นหา FindNearest ในช่อง |
ขอบเขตการค้นหา
ดัชนีแต่ละรายการจะกำหนดขอบเขตเป็นคอลเล็กชันหรือกลุ่มคอลเล็กชัน ซึ่งเรียกว่าขอบเขตการค้นหาของดัชนี
- ขอบเขตคอลเล็กชัน
- Cloud Firestore สร้างดัชนีที่มีขอบเขตคอลเล็กชันโดยค่าเริ่มต้น ดัชนีเหล่านี้รองรับการค้นหาที่แสดงผลลัพธ์จากคอลเล็กชันเดียว
- ขอบเขตกลุ่มคอลเล็กชัน
- กลุ่มคอลเล็กชันประกอบด้วยคอลเล็กชันทั้งหมดที่มีรหัสคอลเล็กชันเดียวกัน หากต้องการเรียกใช้การค้นหากลุ่มคอลเล็กชันที่แสดงผลลัพธ์ที่กรองหรือจัดเรียงจากกลุ่มคอลเล็กชัน คุณต้องสร้างดัชนีที่เกี่ยวข้องซึ่งมีขอบเขตเป็นกลุ่มคอลเล็กชัน
การเรียงลำดับเริ่มต้นและช่อง __name__
นอกจากการจัดเรียงเอกสารตามโหมดดัชนีที่ระบุไว้สำหรับแต่ละฟิลด์ (จากน้อยไปมากหรือจากมากไปน้อย) แล้ว ดัชนียังใช้การจัดเรียงขั้นสุดท้ายตามฟิลด์ __name__ ของเอกสารแต่ละรายการด้วย ค่าของช่อง __name__ จะตั้งเป็นเส้นทางเอกสารแบบเต็ม ซึ่งหมายความว่าเอกสารในชุดผลลัพธ์ที่มีค่าฟิลด์เดียวกันจะจัดเรียงตามเส้นทางเอกสาร
โดยค่าเริ่มต้น ระบบจะจัดเรียงฟิลด์ __name__ ในทิศทางเดียวกับฟิลด์ที่จัดเรียงล่าสุดในคำจำกัดความของดัชนี เช่น
| การรวบรวม | ช่องที่จัดทำดัชนี | ขอบเขตการค้นหา |
|---|---|---|
| เมือง | __name__ |
การรวบรวม |
| เมือง | รัฐ __name__ |
การรวบรวม |
| เมือง | ประเทศ ประชากร __name__ |
การรวบรวม |
หากต้องการจัดเรียงผลลัพธ์ตามทิศทาง __name__ ที่ไม่ใช่ค่าเริ่มต้น คุณต้องสร้างดัชนีนั้น
คุณสมบัติของดัชนี
ดัชนีที่ช่วยให้ดำเนินการค้นหาได้อย่างมีประสิทธิภาพมากที่สุดจะกำหนดโดยพร็อพเพอร์ตี้ต่อไปนี้
- ฟิลด์ที่ใช้ในตัวกรองความเท่ากัน
- ฟิลด์ที่ใช้ในลำดับการจัดเรียง
- ฟิลด์ที่ใช้ในตัวกรองช่วงและความไม่เท่ากัน (ซึ่งยังไม่ได้รวมอยู่ในลำดับการจัดเรียง)
- ฟิลด์ที่ใช้ในการรวม (ซึ่งยังไม่ได้รวมอยู่ในลำดับการจัดเรียงและตัวกรองช่วงและความไม่เท่ากัน)
Cloud Firestore จะคำนวณผลลัพธ์สำหรับการค้นหาดังนี้
- ระบุดัชนีที่สอดคล้องกับคอลเล็กชัน พร็อพเพอร์ตี้ตัวกรอง โอเปอเรเตอร์ตัวกรอง และลำดับการจัดเรียงของคำค้นหา
- ระบุตำแหน่งดัชนีที่การสแกนเริ่มต้น ตำแหน่งเริ่มต้นจะขึ้นต้นด้วยตัวกรองความเท่ากันของคำค้นหา และลงท้ายด้วยตัวกรองช่วงและความไม่เท่ากันในช่อง
orderByแรก - เริ่มสแกนดัชนี โดยแสดงผลเอกสารแต่ละรายการที่ตรงตามตัวกรองทั้งหมด จนกว่ากระบวนการสแกนจะทำอย่างใดอย่างหนึ่งต่อไปนี้
- พบเอกสารที่ไม่ตรงตามเงื่อนไขตัวกรอง และยืนยันว่าเอกสารที่ตามมาจะไม่ตรงตามเงื่อนไขตัวกรองอย่างสมบูรณ์
- ถึงจุดสิ้นสุดของดัชนี
- รวบรวมจำนวนผลการค้นหาสูงสุดที่คำขอค้นหาต้องการ
ตัวอย่างการจัดทำดัชนี
การสร้างดัชนีแบบช่องเดียวให้คุณโดยอัตโนมัติจะช่วยให้ Cloud Firestore รองรับการค้นหาฐานข้อมูลขั้นพื้นฐานที่สุดได้อย่างรวดเร็ว
ดัชนีแบบช่องเดียวช่วยให้คุณทำการค้นหาอย่างง่ายโดยอิงตามค่าของช่องและตัวเปรียบเทียบ <, <=, ==, >=, > และ in สำหรับช่องอาร์เรย์ ช่องเหล่านี้จะช่วยให้คุณทำการค้นหา array-contains และ array-contains-any ได้
ลองดูตัวอย่างต่อไปนี้จากมุมมองของการสร้างดัชนีเพื่อทำความเข้าใจให้ชัดเจนยิ่งขึ้น ข้อมูลโค้ดต่อไปนี้จะสร้างเอกสาร city 2-3 รายการในคอลเล็กชัน cities และตั้งค่าช่อง name, state, country, capital, population และ regions สำหรับเอกสารแต่ละรายการ
เว็บ
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"])
การค้นหาที่รองรับโดยดัชนีที่สร้างด้วยตนเอง
สร้างดัชนีด้วยตนเองเพื่อรองรับการค้นหาแบบผสมที่ดัชนีช่องเดียวแบบอัตโนมัติยังไม่รองรับ ตัวอย่างเช่น คุณจะต้องมีดัชนีที่สร้างด้วยตนเองสำหรับคำค้นหาต่อไปนี้
เว็บ
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 | ประเทศ, ประชากร | การรวบรวม |
เพื่อหลีกเลี่ยงการสูญเสียประสิทธิภาพที่เกิดจากการรวมดัชนี เราขอแนะนำให้คุณสร้างดัชนีเพื่อรวมการค้นหา 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
- neighborhoods ASC
- ย่านใกล้เคียง DESC
- อุณหภูมิ ASC
- อุณหภูมิ DESC
- temperatures.summer ASC
- temperatures.summer DESC
- temperatures.winter ASC
- temperatures.winter DESC
- neighborhoods Array Contains
ดัชนีที่สร้างด้วยตนเอง
- city_name ASC, neighborhoods ARRAY
- city_name DESC, neighborhoods ARRAY
รายการดัชนี
การกำหนดค่าการจัดทำดัชนีนี้ส่งผลให้เกิดรายการดัชนีต่อไปนี้สำหรับเอกสาร
| ดัชนี | ข้อมูลที่จัดทำดัชนี |
|---|---|
| รายการดัชนีอัตโนมัติ | |
| city_name ASC | city_name: "San Francisco" |
| city_name DESC | city_name: "San Francisco" |
| neighborhoods ASC | neighborhoods: ["Mission", "Downtown", "Marina"] |
| ย่านใกล้เคียง DESC | neighborhoods: ["Mission", "Downtown", "Marina"] |
| อุณหภูมิ ASC | temperatures: {summer: 67, winter: 55} |
| อุณหภูมิ DESC | temperatures: {summer: 67, winter: 55} |
| 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 Array Contains | neighborhoods: "Mission" |
| neighborhoods Array Contains | neighborhoods: "Downtown" |
| neighborhoods Array Contains | neighborhoods: "Marina" |
| รายการดัชนีที่สร้างด้วยตนเอง | |
| city_name ASC, neighborhoods ARRAY | city_name: "San Francisco", neighborhoods: "Mission" |
| city_name ASC, neighborhoods ARRAY | city_name: "กรุงเทพฯ", neighborhoods: "ปทุมวัน" |
| 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: "กรุงเทพฯ", neighborhoods: "ปทุมวัน" |
| 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 จากน้อยไปมากเสมอ
เว็บ
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")คุณสามารถสร้างดัชนีสำหรับการค้นหาแต่ละรายการได้ดังนี้
| การรวบรวม | ช่องที่จัดทำดัชนี | ขอบเขตการค้นหา |
|---|---|---|
| ร้านอาหาร | หมวดหมู่, การให้ดาว ดวง | การรวบรวม |
| ร้านอาหาร | city, star_rating | การรวบรวม |
| ร้านอาหาร | category, city, star_rating | การรวบรวม |
| ร้านอาหาร | category, city, editors_pick, star_rating | การรวบรวม |
วิธีแก้ปัญหาที่ดีกว่าคือคุณสามารถลดจำนวนดัชนีได้โดยใช้ประโยชน์จากความสามารถของ Cloud Firestore ในการผสานดัชนีสำหรับส่วนคำสั่งความเท่ากัน
| การรวบรวม | ช่องที่จัดทำดัชนี | ขอบเขตการค้นหา |
|---|---|---|
| ร้านอาหาร | หมวดหมู่, การให้ดาว ดวง | การรวบรวม |
| ร้านอาหาร | 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 ขนาดรวมคือผลรวมของรายการต่อไปนี้สำหรับเอกสาร |
| ขนาดสูงสุดของค่าในช่องที่จัดทำดัชนี |
1500 ไบต์ ระบบจะตัดค่าในช่องที่เกิน 1,500 ไบต์ให้สั้นลง การค้นหาที่เกี่ยวข้องกับค่าในช่องที่ถูกตัดอาจแสดงผลลัพธ์ที่ไม่สอดคล้องกัน |
แนวทางปฏิบัติแนะนำในการจัดทำดัชนี
สำหรับแอปส่วนใหญ่ คุณสามารถใช้การจัดทำดัชนีอัตโนมัติและลิงก์ข้อความแสดงข้อผิดพลาดเพื่อจัดการดัชนีได้ อย่างไรก็ตาม คุณอาจต้องเพิ่มข้อยกเว้นการจัดทำดัชนีอัตโนมัติในกรณีต่อไปนี้
| การก | คำอธิบาย |
|---|---|
| ช่องสตริงขนาดใหญ่ | หากคุณมีช่องสตริงที่มักมีค่าสตริงยาวๆ ซึ่งคุณไม่ได้ใช้สำหรับการค้นหา คุณสามารถลดค่าใช้จ่ายในการจัดเก็บข้อมูลได้โดยยกเว้นช่องดังกล่าวจากการจัดทำดัชนี |
| อัตราการเขียนสูงไปยังคอลเล็กชันที่มีเอกสารซึ่งมีค่าตามลำดับ | หากคุณจัดทำดัชนีฟิลด์ที่เพิ่มขึ้นหรือลดลงตามลำดับระหว่างเอกสารในคอลเล็กชัน เช่น การประทับเวลา อัตราการเขียนสูงสุดไปยังคอลเล็กชันคือ 500 การเขียนต่อวินาที หากไม่ได้ค้นหาตามฟิลด์ที่มีค่าตามลำดับ คุณสามารถยกเว้นฟิลด์จากการจัดทำดัชนีเพื่อข้ามขีดจำกัดนี้ได้ ในกรณีการใช้งาน IoT ที่มีอัตราการเขียนสูง เช่น คอลเล็กชันที่มีเอกสารซึ่งมีช่องการประทับเวลาอาจมีอัตราการเขียนใกล้ถึงขีดจำกัด 500 ครั้งต่อวินาที |
| ช่อง TTL |
หากคุณใช้นโยบาย TTL (Time-To-Live) โปรดทราบว่าช่อง TTL ต้องเป็นการประทับเวลา การจัดทำดัชนีในช่อง TTL จะเปิดใช้อยู่โดยค่าเริ่มต้น และอาจส่งผลต่อประสิทธิภาพเมื่อมีอัตราการเข้าชมสูงขึ้น แนวทางปฏิบัติแนะนำคือให้เพิ่มการยกเว้นการจัดทำดัชนีอัตโนมัติสำหรับช่อง TTL |
| ช่องอาร์เรย์หรือแผนที่ขนาดใหญ่ | ฟิลด์อาร์เรย์หรือแผนที่ขนาดใหญ่อาจมีรายการดัชนีใกล้ถึงขีดจำกัด 40,000 รายการต่อเอกสาร หากไม่ได้ค้นหาตามอาร์เรย์ขนาดใหญ่หรือฟิลด์แผนที่ คุณควรยกเว้นฟิลด์ดังกล่าวจากการจัดทำดัชนี |
หากคุณใช้การค้นหาที่มีโอเปอเรเตอร์ช่วงและอสมการในหลายช่อง โปรดดูข้อควรพิจารณาเกี่ยวกับการจัดทำดัชนีที่คุณควรพิจารณาเพื่อเพิ่มประสิทธิภาพและลดค่าใช้จ่ายในการค้นหา Cloud Firestore
ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีแก้ไขปัญหาการจัดทำดัชนี (การกระจายดัชนี, ข้อผิดพลาด INVALID_ARGUMENT) ได้ที่หน้าการแก้ปัญหา