หากต้องการแก้ปัญหาการค้นหาที่ช้า ให้ใช้ 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 กับคำอธิบายการค้นหา
คุณสามารถใช้ Query Explain โดยเฉพาะ
กับตัวเลือก analyze เพื่อสังเกตผลของ forceIndex ได้ดังนี้
- ตรวจสอบว่า Cloud Firestore ใช้ดัชนีที่ระบุใน
forceIndexโดย ตรวจสอบโหนดใบของแผนผังการดำเนินการสำหรับรหัสดัชนี - ตรวจสอบว่าโหนด
TableScanปรากฏในแผนเมื่อใช้forceIndex: "primary" - เปรียบเทียบเมตริกประสิทธิภาพ เช่น เวลาในการตอบสนอง เอกสารที่สแกน และรายการดัชนีที่สแกน โดยมีและไม่มี
forceIndexเพื่อปรับแต่งประสิทธิภาพการค้นหา
แนวทางปฏิบัติแนะนำสำหรับforceIndex
แม้ว่า forceIndex จะช่วยให้ควบคุมการดำเนินการค้นหาได้มากขึ้น แต่โดยทั่วไปแล้วCloud Firestoreตัวเพิ่มประสิทธิภาพการค้นหาจะทำงานได้อย่างมีประสิทธิภาพสำหรับกรณีการใช้งานส่วนใหญ่
ลองทำตามแนวทางปฏิบัติแนะนำต่อไปนี้เมื่อใช้ forceIndex
- ใช้
forceIndexอย่างรอบคอบ หากพบว่าประสิทธิภาพไม่ดีเท่าที่ควรด้วยแผนการค้นหาเริ่มต้น ให้ใช้ Query Explain เพื่อวิเคราะห์ปัญหา ก่อนที่จะบังคับใช้ดัชนี - เมื่อใช้
forceIndexให้ทดสอบการค้นหาด้วยปริมาณข้อมูลที่สมจริงเพื่อทําความเข้าใจลักษณะด้านประสิทธิภาพและต้นทุน - หลีกเลี่ยงการใช้
forceIndex: "primary"กับคอลเล็กชันขนาดใหญ่ในสภาพแวดล้อมการใช้งานจริง