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