หากต้องการแก้ปัญหาการค้นหาที่ช้า ให้ใช้ Query Explain เพื่อรับแผนการดำเนินการค้นหา และโปรไฟล์การดำเนินการรันไทม์ ส่วนต่อไปนี้จะอธิบาย ขั้นตอนที่คุณสามารถทำได้เพื่อเพิ่มประสิทธิภาพการค้นหาโดยขึ้นอยู่กับโปรไฟล์การดำเนินการ
จำกัดจำนวนผลลัพธ์
ใช้ฟิลด์ระเบียนที่แสดงผลในแผนการดำเนินการเพื่อ
ระบุว่าการค้นหาแสดงผลเอกสารจำนวนมากหรือไม่ ลองจำกัดจำนวน
เอกสารที่ส่งคืนโดยใช้
limit(...) สเตจ ซึ่งจะช่วยลดขนาดไบต์ที่แปลงเป็นอนุกรมของผลลัพธ์เมื่อแสดงผลต่อ
ไคลเอ็นต์ผ่านเครือข่าย ในกรณีที่โหนด Limit อยู่ก่อนโหนด MajorSort เครื่องมือค้นหาสามารถรวมโหนด Limit และ MajorSort เข้าด้วยกัน และแทนที่การสร้างและการจัดเรียงในหน่วยความจำทั้งหมดด้วยการจัดเรียง TopN ซึ่งจะช่วยลดข้อกำหนดด้านหน่วยความจำสำหรับการค้นหา
จำกัดขนาดเอกสารผลลัพธ์
ลองจำกัดขนาดของเอกสารที่แสดงโดยใช้ select(...) เพื่อแสดงเฉพาะฟิลด์ที่จำเป็น หรือใช้ remove_fields(...) เพื่อทิ้งฟิลด์ที่มีขนาดใหญ่เกินไป ซึ่งจะช่วยลดต้นทุนด้านการประมวลผลและหน่วยความจำในการประมวลผล
ผลลัพธ์ระดับกลาง รวมถึงขนาดไบต์ที่แปลงเป็นอนุกรมของผลลัพธ์เมื่อส่งกลับ
ไปยังไคลเอ็นต์ผ่านเครือข่าย ในกรณีที่ฟิลด์ทั้งหมดที่อ้างอิงในคําค้นหาครอบคลุมโดยดัชนีปกติ การดำเนินการนี้ยังช่วยให้การสแกนดัชนีครอบคลุมคําค้นหาได้อย่างเต็มที่ ซึ่งช่วยลดความจําเป็นในการดึงข้อมูลเอกสารจากที่เก็บข้อมูลหลัก
ใช้ดัชนี
ใช้วิธีการต่อไปนี้เพื่อตั้งค่าและเพิ่มประสิทธิภาพดัชนี
ระบุว่าคําค้นหาใช้ดัชนีหรือไม่
คุณสามารถระบุได้ว่าคําค้นหาใช้ดัชนีหรือไม่โดยตรวจสอบโหนดใบใน แผนผังการดำเนินการ หากโหนดใบของแผนผังการดำเนินการเป็นโหนด TableScan นั่นหมายความว่าคําค้นหาไม่ได้ใช้ดัชนีและกําลังสแกนเอกสารจากที่เก็บข้อมูลหลัก หากมีการใช้ดัชนี โหนดใบของแผนผังการดำเนินการจะแสดงรหัสดัชนีและฟิลด์ดัชนีของดัชนี
ระบุดัชนีที่ดีกว่า
ดัชนีมีประโยชน์สำหรับการค้นหาหากสามารถลดจำนวนเอกสารที่เครื่องมือค้นหาต้องดึงจากพื้นที่เก็บข้อมูลหลัก หรือหากการจัดลำดับฟิลด์สามารถตอบสนองข้อกำหนดการจัดเรียงของการค้นหาได้
หากใช้ดัชนีสำหรับคำค้นหา แต่เครื่องมือค้นหายังคงดึงข้อมูลและ ทิ้งเอกสารจำนวนมาก ตามที่ระบุโดยโหนดสแกนที่แสดงผลระเบียนจำนวนมาก ตามด้วยโหนดตัวกรอง ที่แสดงผลระเบียนจำนวนน้อย นี่เป็นสัญญาณที่บ่งชี้ว่า เพรดิเคตของคำค้นหาที่ตรงกันโดยใช้ดัชนีนั้นไม่ได้เลือก ดูวิธีสร้างดัชนีที่เหมาะสมยิ่งขึ้นได้ที่สร้างดัชนี
หากใช้ดัชนีสำหรับคำค้นหา แต่เครื่องมือค้นหายังคงจัดลำดับชุดผลลัพธ์ใหม่ในหน่วยความจำ ดังที่ระบุโดยโหนด MajorSort ในแผนการดำเนินการของคำค้นหา นี่เป็นสัญญาณว่าดัชนีที่ใช้ไม่สามารถใช้เพื่อตอบสนองข้อกำหนดการจัดเรียงของคำค้นหาได้ ดูส่วนถัดไปเพื่อสร้างดัชนีที่ เหมาะสมยิ่งขึ้น
สร้างดัชนี
ทำตามเอกสารประกอบการจัดการดัชนีเพื่อสร้างดัชนี หากต้องการให้การค้นหาใช้ดัชนีได้ ให้สร้างดัชนีปกติ (ไม่ใช่ดัชนีหลายคีย์) โดยมีฟิลด์ตามลำดับต่อไปนี้
- ฟิลด์ทั้งหมดที่จะใช้ในตัวดำเนินการเท่ากับ หากต้องการเพิ่มโอกาสในการนำกลับมาใช้ใหม่ ในการค้นหา ให้จัดเรียงฟิลด์ตามลำดับการเกิดของฟิลด์ใน ตัวดำเนินการเท่ากับในการค้นหา
- ฟิลด์ทั้งหมดที่จะจัดเรียง (ในลำดับเดียวกัน)
- ฟิลด์ที่จะใช้ในโอเปอเรเตอร์ช่วงหรือโอเปอเรเตอร์ความไม่เท่ากันในลำดับการลดลงของความสามารถในการเลือกข้อจำกัดการค้นหา
- ฟิลด์ที่จะแสดงเป็นส่วนหนึ่งของ การค้นหาในดัชนี: การรวมฟิลด์ดังกล่าวไว้ในดัชนีจะช่วยให้ดัชนีครอบคลุม การค้นหาและหลีกเลี่ยงการดึงข้อมูลเอกสารจากที่เก็บข้อมูลหลัก
บังคับการสแกนดัชนีหรือตาราง
เมื่อคุณค้นหา Cloud Firestore ระบบจะใช้ดัชนีใดก็ตามโดยอัตโนมัติ
ซึ่งมีแนวโน้มที่จะทำให้การค้นหามีประสิทธิภาพมากขึ้น ด้วยเหตุนี้ คุณจึงไม่จำเป็นต้อง
ระบุดัชนีสำหรับการค้นหา อย่างไรก็ตาม สำหรับการค้นหาที่มีความสำคัญ
ต่อปริมาณงาน เราขอแนะนำให้คุณใช้ตัวเลือก forceIndex เพื่อให้
ประสิทธิภาพสม่ำเสมอมากขึ้น
ในบางกรณี Cloud Firestore อาจเลือกดัชนีที่ทำให้เวลาในการตอบสนองของคำค้นหาเพิ่มขึ้น
หากทำตามขั้นตอนการแก้ปัญหาสำหรับการถดถอยของประสิทธิภาพแล้ว
และยืนยันว่าการลองใช้ดัชนีอื่นสำหรับการค้นหานั้นสมเหตุสมผล คุณจะระบุดัชนีได้โดยใช้ตัวเลือก forceIndex
คุณใช้ตัวเลือก forceIndex ในขั้นตอนการป้อนข้อมูลใดก็ได้ใน
การดำเนินการของไปป์ไลน์เพื่อลบล้างการค้นหาเริ่มต้นของ Cloud Firestore
แผนการดำเนินการ และระบุดัชนีที่จะใช้ หรือบังคับให้สแกนตาราง
บังคับใช้ดัชนีที่เฉพาะเจาะจง
หากต้องการบังคับให้การค้นหาใช้ดัชนีที่เฉพาะเจาะจง ให้ระบุรหัสดัชนีเป็นสตริง
ไปยังตัวเลือก forceIndex คุณดูรหัสดัชนีได้จากคอนโซลหรือจากข้อความแสดงข้อผิดพลาด
ตัวอย่างต่อไปนี้บังคับให้เครื่องมือวางแผนใช้ดัชนีที่มีรหัส CICAgOi36pgK
Node.js
// Force Planner to use Index ID CICAgOi36pgK await db.pipeline() .collectionGroup({ collectionId: "customers", forceIndex: "CICAgOi36pgK" }) .limit(100) .execute();
Java
// Force Planner to use Index ID CICAgOi36pgK Pipeline.Snapshot results1 = firestore.pipeline() .collectionGroup("customers", new CollectionGroupOptions() .withHints(new CollectionHints().withForceIndex("CICAgOi36pgK"))) .limit(100) .execute().get();
Go
// Force Planner to use Index ID CICAgOi36pgK snapshot1 := client.Pipeline(). CollectionGroup("customers", firestore.WithForceIndex("CICAgOi36pgK")). Limit(100). Execute(ctx)
กรณีการใช้งานบางส่วนสำหรับการบังคับใช้ดัชนีที่เฉพาะเจาะจงมีดังนี้
- การทดสอบประสิทธิภาพของดัชนีต่างๆ
- ตรวจสอบว่าใช้ดัชนีที่เฉพาะเจาะจงและทราบว่าเหมาะสมที่สุดสำหรับการค้นหา
- การลบล้างตัวเพิ่มประสิทธิภาพเมื่อตัวเลือกเริ่มต้นไม่เหมาะสมสำหรับคำค้นหาหนึ่งๆ
หากไม่พบดัชนีที่ระบุ การค้นหาจะล้มเหลว
บังคับการสแกนตาราง
การสแกนตารางจะอ่านเอกสารในคอลเล็กชันหรือกลุ่มคอลเล็กชันโดยไม่ใช้ดัชนีรอง หากต้องการบังคับให้สแกนตาราง ให้ตั้งค่า forceIndex เป็น primary
ตัวอย่างต่อไปนี้บังคับให้สแกนตาราง
// Force Planner to only do a Full-Table Scan
db.pipeline()
.collectionGroup({ collectionId: "customers", forceIndex: "primary" })
.limit(100)
คุณอาจใช้การสแกนตารางในกรณีต่อไปนี้
- สำหรับคอลเล็กชันขนาดเล็กมากซึ่งไม่จำเป็นต้องมีค่าใช้จ่ายในการจัดทำดัชนี
- สำหรับคำค้นหาที่เข้าถึงเอกสารส่วนใหญ่ในคอลเล็กชัน
- สำหรับการแก้ไขข้อบกพร่องและการเปรียบเทียบประสิทธิภาพ
ใช้ forceIndex กับคำอธิบายการค้นหา
คุณสามารถใช้คำอธิบายคำค้นหาในโหมด
explain หรือ analyze เพื่อสังเกตผลลัพธ์ของ forceIndex ได้ดังนี้
- ตรวจสอบว่า Cloud Firestore ใช้ดัชนีที่ระบุใน
forceIndexโดย ตรวจสอบโหนดใบของแผนผังการดำเนินการสำหรับรหัสดัชนี - ตรวจสอบว่าโหนด
TableScanปรากฏในแผนเมื่อใช้forceIndex: "primary" - ใน
analyzeโหมด ให้เปรียบเทียบเมตริกประสิทธิภาพ เช่น เวลาในการตอบสนอง เอกสารที่สแกน และรายการดัชนีที่สแกน โดยมีและไม่มีforceIndexเพื่อปรับประสิทธิภาพการค้นหา
แนวทางปฏิบัติแนะนำสำหรับforceIndex
แม้ว่า forceIndex จะให้การควบคุมการดำเนินการค้นหาได้มากขึ้น แต่โดยทั่วไปแล้วCloud Firestoreตัวเพิ่มประสิทธิภาพการค้นหาจะทำงานได้อย่างมีประสิทธิภาพสำหรับกรณีการใช้งานส่วนใหญ่
ลองทำตามแนวทางปฏิบัติแนะนำต่อไปนี้เมื่อใช้ forceIndex
- ใช้
forceIndexอย่างรอบคอบ หากพบว่าประสิทธิภาพไม่ดีเท่าที่ควรด้วยแผนการค้นหาเริ่มต้น ให้ใช้ Query Explain เพื่อวิเคราะห์ปัญหา ก่อนที่จะบังคับใช้ดัชนี - เมื่อใช้
forceIndexให้ทดสอบการค้นหาด้วยปริมาณข้อมูลที่สมจริงเพื่อทําความเข้าใจลักษณะด้านประสิทธิภาพและต้นทุน - หลีกเลี่ยงการใช้
forceIndex: "primary"กับคอลเล็กชันขนาดใหญ่ในสภาพแวดล้อมการใช้งานจริง
ดูข้อมูลเพิ่มเติมเกี่ยวกับเอาต์พุตของการค้นหาที่ดำเนินการด้วย Query Explain ได้ที่ข้อมูลอ้างอิงการดำเนินการค้นหา