ดัชนีเป็นปัจจัยสำคัญต่อประสิทธิภาพของฐานข้อมูล ดัชนีฐานข้อมูลจะจับคู่รายการต่างๆ ในฐานข้อมูลกับตำแหน่งในฐานข้อมูล ซึ่งคล้ายกับดัชนีของหนังสือที่จับคู่หัวข้อในหนังสือกับเลขหน้า เมื่อคุณส่งการค้นหาไปยังฐานข้อมูล ฐานข้อมูลจะใช้ดัชนีเพื่อค้นหาตำแหน่งของรายการที่คุณขอได้อย่างรวดเร็ว
หน้านี้อธิบายดัชนี 2 ประเภทที่ Cloud Firestore ใช้ ได้แก่ ดัชนีช่องเดียวและดัชนี Composite
คำจำกัดความของดัชนีและโครงสร้าง
ระบบจะกำหนดดัชนีในรายการช่องของเอกสารหนึ่งๆ พร้อมด้วยโหมดดัชนีที่เกี่ยวข้องสำหรับแต่ละช่อง
ดัชนีจะมีรายการสำหรับทุกฟิลด์ที่มีชื่ออยู่ในคำจำกัดความของดัชนี ดัชนีจะรวมเอกสารทั้งหมดที่เป็นผลลัพธ์ที่เป็นไปได้สำหรับการค้นหาตามดัชนี เอกสารจะรวมอยู่ในดัชนีก็ต่อเมื่อมีชุดค่าที่จัดทำดัชนีสำหรับทุกฟิลด์ที่ใช้ในดัชนี หากคำจำกัดความของดัชนีหมายถึงฟิลด์ที่เอกสารไม่ได้ตั้งค่าไว้ เอกสารนั้นจะไม่ปรากฏในดัชนี จึงไม่ส่งคืนผลลัพธ์สำหรับการค้นหาที่อิงตามดัชนี
ดัชนีผสมจะจัดเรียงตามค่าของช่อง ตามลำดับที่ระบุในการกำหนดดัชนี
ดัชนีที่อยู่เบื้องหลังทุกคำค้นหา
ถ้าไม่มีดัชนีสำหรับการค้นหา ฐานข้อมูลส่วนใหญ่จะรวบรวมข้อมูลผ่านรายการเนื้อหาแยกตามรายการ ซึ่งเป็นกระบวนการที่ช้าซึ่งจะช้าลงไปอีกเมื่อฐานข้อมูลมีขนาดใหญ่ขึ้น Cloud Firestore รับประกันประสิทธิภาพคำค้นหาที่สูงโดยใช้ดัชนีสำหรับการค้นหาทั้งหมด ดังนั้น ประสิทธิภาพการค้นหาจึงขึ้นอยู่กับขนาดของชุดผลลัพธ์ ไม่ใช่จำนวนรายการในฐานข้อมูล
การจัดการดัชนีน้อยลง การพัฒนาแอปมากขึ้น
Cloud Firestore มีฟีเจอร์ที่ช่วยลดระยะเวลาที่ต้องใช้ในการจัดการดัชนี ระบบจะสร้างดัชนีที่จำเป็นสำหรับการค้นหาขั้นพื้นฐานที่สุดให้คุณโดยอัตโนมัติ เมื่อคุณใช้และทดสอบแอป Cloud Firestore จะช่วยระบุและสร้างดัชนีเพิ่มเติมที่แอปต้องการ
ประเภทดัชนี
Cloud Firestore ใช้ดัชนี 2 ประเภท ได้แก่ ช่องเดียวและcomposite นอกจากจำนวนช่องที่มีการจัดทำดัชนีแล้ว ดัชนีช่องเดียวและดัชนีผสมยังขึ้นอยู่กับว่าคุณจัดการช่องเหล่านั้นอย่างไร
ดัชนีช่องเดียว
ดัชนีช่องเดียวจะเก็บการแมปที่จัดเรียงของเอกสารทั้งหมดในคอลเล็กชันที่มีช่องที่ระบุ แต่ละรายการในดัชนีช่องเดียวจะบันทึกค่าของเอกสารสำหรับช่องใดช่องหนึ่งและตำแหน่งของเอกสารในฐานข้อมูล Cloud Firestore ใช้ดัชนีเหล่านี้เพื่อดำเนินการค้นหาพื้นฐานหลายรายการ คุณจัดการดัชนีช่องเดียวได้โดยกำหนดการตั้งค่าการจัดทำดัชนีอัตโนมัติของฐานข้อมูลและการยกเว้นดัชนี
การจัดทำดัชนีอัตโนมัติ
โดยค่าเริ่มต้น Cloud Firestore จะเก็บรักษาดัชนีช่องเดียวสำหรับแต่ละช่องในเอกสารและช่องย่อยแต่ละช่องในแผนที่โดยอัตโนมัติ Cloud Firestore ใช้การตั้งค่าเริ่มต้นต่อไปนี้สำหรับดัชนีช่องเดียว
สำหรับช่องที่ไม่ใช่อาร์เรย์และช่องที่ไม่ใช่แผนที่ Cloud Firestore จะกำหนดดัชนีช่องเดียวแบบ collection-scope ช่องที่ 1 ในโหมดจากน้อยไปมากและอีก 1 รายการในโหมดจากมากไปน้อย
Cloud Firestore จะสร้างข้อมูลต่อไปนี้สำหรับแต่ละช่องแผนที่
- ดัชนีจากน้อยไปมากสำหรับขอบเขตคอลเล็กชัน 1 รายการสำหรับช่องย่อยที่ไม่ใช่อาร์เรย์และไม่ใช่แผนที่
- ดัชนีที่กำหนดขอบเขตระดับคอลเล็กชัน 1 รายการสำหรับช่องย่อยที่ไม่ใช่อาร์เรย์และไม่ใช่แผนที่
- อาร์เรย์ขอบเขตคอลเล็กชัน 1 รายการมีดัชนีสำหรับช่องย่อยของอาร์เรย์แต่ละฟิลด์
- Cloud Firestore จัดทำดัชนีซ้ำสำหรับทุกช่องย่อยของแมป
Cloud Firestore จะสร้างและคงอาร์เรย์ที่มีดัชนี "อาร์เรย์ขอบเขตคอลเล็กชัน" สำหรับแต่ละช่องของอาร์เรย์ในเอกสาร
ดัชนีช่องเดียวที่มีขอบเขตกลุ่มคอลเล็กชันไม่ได้รับการดูแลโดยค่าเริ่มต้น
การยกเว้นดัชนีช่องเดียว
คุณยกเว้นช่องจากการตั้งค่าการจัดทำดัชนีอัตโนมัติได้โดยสร้างการยกเว้นดัชนีช่องเดียว การยกเว้นการจัดทำดัชนีจะลบล้างการตั้งค่าดัชนีอัตโนมัติของทั้งฐานข้อมูล การยกเว้นจะเปิดใช้ดัชนีช่องเดียวที่การตั้งค่าการจัดทำดัชนีอัตโนมัติจะปิดใช้หรือปิดใช้ดัชนีช่องเดียวซึ่งการจัดทำดัชนีอัตโนมัติจะเปิดใช้ สำหรับกรณีที่การยกเว้นจะมีประโยชน์ โปรดดูแนวทางปฏิบัติแนะนำในการจัดทำดัชนี
ใช้ค่าเส้นทางช่อง *
เพื่อเพิ่มการยกเว้นดัชนีระดับคอลเล็กชันในทุกช่องในกลุ่มคอลเล็กชัน ตัวอย่างเช่น สำหรับกลุ่มคอลเล็กชัน 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 ในช่อง |
เวกเตอร์ | รองรับวลีการค้นหา FindNearest ในช่อง |
ขอบเขตการค้นหา
ดัชนีแต่ละรายการจะกำหนดขอบเขตไว้เป็นคอลเล็กชันหรือกลุ่มคอลเล็กชัน ซึ่งเรียกว่าขอบเขตการค้นหาของดัชนี
- ขอบเขตคอลเล็กชัน
- Cloud Firestore สร้างดัชนีที่มีขอบเขตคอลเล็กชันโดยค่าเริ่มต้น ดัชนีเหล่านี้รองรับการค้นหาที่แสดงผลลัพธ์จากคอลเล็กชันเดียว
- ขอบเขตกลุ่มคอลเล็กชัน
- กลุ่มคอลเล็กชันจะมีคอลเล็กชันทั้งหมดที่มีรหัสคอลเล็กชันเดียวกัน หากต้องการเรียกใช้การค้นหากลุ่มคอลเล็กชันที่แสดงผลลัพธ์ที่กรองแล้วหรือเรียงลำดับจากกลุ่มคอลเล็กชัน คุณต้องสร้างดัชนีที่เกี่ยวข้องซึ่งมีขอบเขตกลุ่มคอลเล็กชัน
การจัดลำดับเริ่มต้นและช่อง __name__
นอกจากการจัดเรียงเอกสารตามโหมดดัชนีที่ระบุสําหรับแต่ละช่อง (จากน้อยไปมากหรือมากไปน้อย) แล้ว ดัชนียังใช้การจัดเรียงขั้นสุดท้ายตามช่อง __name__
ของเอกสารแต่ละรายการด้วย ค่าของช่อง __name__
ได้รับการตั้งค่าเป็นเส้นทางแบบเต็มของเอกสาร ซึ่งหมายความว่าเอกสารในชุดผลลัพธ์ที่มีค่าช่องเดียวกันจะจัดเรียงตามเส้นทางของเอกสาร
โดยค่าเริ่มต้น ช่อง __name__
จะจัดเรียงในทิศทางเดียวกันของช่องที่จัดเรียงล่าสุดในคำจำกัดความของดัชนี เช่น
การรวบรวม | ช่องที่จัดทำดัชนี | ขอบเขตการค้นหา |
---|---|---|
เมือง | ชื่อ __name__ |
, การรวบรวม |
เมือง | รัฐ__name__ |
การรวบรวม |
เมือง | ประเทศ__name__ ประเทศ |
ประชากร การรวบรวม |
หากต้องการจัดเรียงผลลัพธ์ตามทิศทาง __name__
ที่ไม่ใช่ค่าเริ่มต้น คุณจะต้องสร้างดัชนีนั้น
ดัชนีที่สมบูรณ์แบบ
ดัชนีที่สมบูรณ์แบบสำหรับการค้นหาที่ช่วยให้ดำเนินการค้นหาได้อย่างมีประสิทธิภาพมากที่สุดนั้น ได้รับการกำหนดตามคุณสมบัติต่อไปนี้
- ช่องที่ใช้ในตัวกรองความเท่าเทียมกัน
- ช่องที่ใช้ในลำดับการจัดเรียง
- ฟิลด์ที่ใช้ในตัวกรองช่วงและอสมการ (ที่ไม่ได้รวมอยู่ในลำดับการจัดเรียง)
- ช่องที่ใช้ในการรวม (ที่ยังไม่ได้รวมอยู่ในลำดับการจัดเรียง และตัวกรองช่วงและอสมการ)
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 จะอัปเดตดัชนีช่องเดียวจากน้อยไปมาก 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")
การรวบรวม | ช่องที่จัดทำดัชนี | ขอบเขตการค้นหา |
---|---|---|
เมือง | ประเทศ ประชากร คน | การรวบรวม |
เมือง | ประเทศ, ประชากร | การรวบรวม |
คุณยังต้องสร้างดัชนีผสมเพื่อรวมการค้นหา 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"]
ดัชนีช่องเดียว
- ชื่อเมือง ASC
- ชื่อเมือง DESC
- อุณหภูมิสีในฤดูร้อน แอสซีซัม
- อุณหภูมิs.ฤดูร้อน DESC
- อุณหภูมิสีในฤดูหนาว ASC
- Temperatures.winter DESC
- ย่านใกล้เคียงของอาร์เรย์ มี (ASC และ DESC)
ดัชนีผสม
- City_name ASC, ย่าน ARRAY
- City_name DESC, ย่าน ARRAY
รายการดัชนี
การกำหนดค่าการจัดทำดัชนีนี้จะส่งผลให้เกิดรายการดัชนี 18 รายการต่อไปนี้สำหรับเอกสาร
ดัชนี | ข้อมูลที่จัดทำดัชนี |
---|---|
รายการดัชนีแบบช่องเดียว | |
ชื่อเมือง ASC | City_name: "เชียงใหม่" |
ชื่อเมือง DESC | City_name: "เชียงใหม่" |
อุณหภูมิสีในฤดูร้อน แอสซีซัม | อุณหภูมิในฤดูร้อน: 67 |
อุณหภูมิs.ฤดูร้อน DESC | อุณหภูมิในฤดูร้อน: 67 |
อุณหภูมิสีในฤดูหนาว ASC | อุณหภูมิในฤดูหนาว: 55 |
Temperatures.winter 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")
คุณสามารถสร้างดัชนีสำหรับคำค้นหาแต่ละรายการดังนี้
การรวบรวม | ช่องที่จัดทำดัชนี | ขอบเขตการค้นหา |
---|---|---|
ร้านอาหาร | หมวดหมู่ | , การให้คะแนน ดาวการรวบรวม |
ร้านอาหาร | เมือง, ดาว | การรวบรวม |
ร้านอาหาร | หมวดหมู่ | , เมือง, ดาวการรวบรวม |
ร้านอาหาร | หมวดหมู่ | , เมือง, Editor_pick, ดาวการรวบรวม |
ทั้งนี้คุณอาจลดจำนวนดัชนีได้โดยใช้ประโยชน์จากความสามารถของ Cloud Firestore ในการรวมดัชนีสำหรับข้อกำหนดความเท่าเทียมด้วยวิธีดังต่อไปนี้
การรวบรวม | ช่องที่จัดทำดัชนี | ขอบเขตการค้นหา |
---|---|---|
ร้านอาหาร | หมวดหมู่ | , การให้คะแนน ดาวการรวบรวม |
ร้านอาหาร | เมือง, ดาว | การรวบรวม |
ร้านอาหาร | เลือกเครื่องมือแก้ไข | รายการ, การให้คะแนน ดาวการรวบรวม |
ดัชนีชุดนี้ไม่เพียงแต่เล็กลงเท่านั้น แต่ยังรองรับการค้นหาเพิ่มเติมด้วย ได้แก่
เว็บไซต์
db.collection("restaurants").where("editors_pick", "==", true) .orderBy("star_rating")
ขีดจำกัดของการจัดทำดัชนี
ขีดจำกัดต่อไปนี้มีผลกับดัชนี โปรดดูโควต้าและขีดจำกัดทั้งหมดที่หัวข้อโควต้าและขีดจำกัด
ขีดจำกัด | รายละเอียด |
---|---|
จำนวนสูงสุดของดัชนีผสมสำหรับฐานข้อมูล |
|
จำนวนสูงสุดของการกำหนดค่าช่องเดียวสำหรับฐานข้อมูล |
การกำหนดค่าระดับช่องรายการเดียวอาจมีการกำหนดค่าหลายรายการสำหรับช่องเดียวกัน เช่น การยกเว้นการจัดทำดัชนีช่องเดียวและนโยบาย TTL ในช่องเดียวกันจะนับเป็นการกําหนดค่าช่องเดียวในขีดจํากัด |
จำนวนรายการดัชนีสูงสุดสำหรับเอกสารแต่ละรายการ |
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
รายการ) ได้ที่หน้าการแก้ปัญหา