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