หากต้องการแก้ปัญหาการค้นหาที่ช้า ให้ใช้ Query Explain เพื่อรับแผนการดำเนินการค้นหา และโปรไฟล์การดำเนินการรันไทม์ ส่วนต่อไปนี้จะอธิบายขั้นตอนที่คุณสามารถทำได้เพื่อเพิ่มประสิทธิภาพการค้นหาโดยขึ้นอยู่กับโปรไฟล์การดำเนินการ
จำกัดจำนวนผลลัพธ์
ใช้ช่อง "บันทึกที่แสดงผล" ในแผนผังการดำเนินการเพื่อระบุว่าการค้นหาแสดงผลเอกสารจำนวนมากหรือไม่ พิจารณาจำกัดจำนวนเอกสารที่แสดงผลโดยใช้ระยะ limit(...) ซึ่งจะช่วยลดขนาดไบต์ที่ซีเรียลไลซ์ของผลลัพธ์เมื่อแสดงผลกับไคลเอ็นต์ผ่านเครือข่าย ในกรณีที่โหนด Limit อยู่ก่อนโหนด MajorSort เครื่องมือค้นหาจะรวมโหนด Limit และ MajorSort เข้าด้วยกัน และแทนที่การสร้างอินสแตนซ์และการจัดเรียงในหน่วยความจำทั้งหมดด้วยการจัดเรียง TopN ซึ่งจะช่วยลดข้อกำหนดด้านหน่วยความจำสำหรับการค้นหา
จำกัดขนาดเอกสารผลลัพธ์
พิจารณาจำกัดขนาดเอกสารที่แสดงผลโดยใช้ select(...) เพื่อแสดงผลเฉพาะช่องที่จำเป็น หรือใช้ remove_fields(...) เพื่อทิ้งช่องที่มีขนาดใหญ่เกินไป ซึ่งจะช่วยลดต้นทุนการประมวลผลและหน่วยความจำในการประมวลผลผลลัพธ์ระดับกลาง รวมถึงขนาดไบต์ที่ซีเรียลไลซ์ของผลลัพธ์เมื่อแสดงผลกับไคลเอ็นต์ผ่านเครือข่าย ในกรณีที่ช่องทั้งหมดที่อ้างอิงในการค้นหาครอบคลุมโดยดัชนีปกติ การดำเนินการนี้ยังช่วยให้การค้นหาครอบคลุมโดยการสแกนดัชนีได้อย่างสมบูรณ์ โดยไม่จำเป็นต้องดึงข้อมูลเอกสารจากพื้นที่เก็บข้อมูลหลัก
ใช้ดัชนี
ใช้คำแนะนำต่อไปนี้เพื่อตั้งค่าและเพิ่มประสิทธิภาพดัชนี
ระบุว่าการค้นหาใช้ดัชนีหรือไม่
คุณสามารถระบุว่าการค้นหาใช้ดัชนีหรือไม่โดยตรวจสอบโหนดลีฟในแผนผังการดำเนินการ หากโหนดลีฟของแผนผังการดำเนินการเป็นโหนด TableScanแสดงว่าการค้นหาไม่ได้ใช้ดัชนีและกำลังสแกนเอกสารจากพื้นที่เก็บข้อมูลหลัก หากมีการใช้ดัชนี โหนดลีฟของแผนผังการดำเนินการจะแสดงรหัสดัชนีและช่องดัชนีของดัชนี
ระบุดัชนีที่ดีกว่า
ดัชนีมีประโยชน์สำหรับการค้นหาหากสามารถลดจำนวนเอกสารที่เครื่องมือค้นหาต้องดึงข้อมูลจากพื้นที่เก็บข้อมูลหลัก หรือหากการจัดลำดับช่องสามารถตอบสนองข้อกำหนดการจัดเรียงของการค้นหาได้
หากมีการใช้ดัชนีสำหรับการค้นหา แต่เครื่องมือค้นหายังคงดึงข้อมูลและ ทิ้งเอกสารจำนวนมาก ซึ่งระบุได้จากโหนด Scan ที่แสดงผลบันทึกจำนวนมากตามด้วย โหนด Filter ที่แสดงผลบันทึกจำนวนน้อย แสดงว่า เพรดิเคตการค้นหาที่ตรงตามเงื่อนไขโดยใช้ดัชนีนั้นไม่ได้เลือก หากต้องการสร้างดัชนีที่เหมาะสมกว่า โปรดดูที่สร้างดัชนี
หากมีการใช้ดัชนีสำหรับการค้นหา แต่เครื่องมือค้นหายังคง จัดลำดับชุดผลลัพธ์ใหม่ในหน่วยความจำ ซึ่งระบุได้จาก โหนด MajorSort ในแผนผังการดำเนินการค้นหา แสดงว่าดัชนีที่ใช้ ไม่สามารถใช้เพื่อตอบสนองข้อกำหนดการจัดเรียงของการค้นหาได้ หากต้องการสร้างดัชนีที่เหมาะสมกว่า โปรดดูส่วนถัดไป
สร้างดัชนี
ทำตามเอกสารประกอบการจัดการดัชนีเพื่อ สร้างดัชนี หากต้องการให้การค้นหาสามารถใช้ดัชนีได้ ให้สร้างดัชนีปกติ (ไม่ใช่ Multikey) ที่มีช่องตามลำดับต่อไปนี้
- ช่องทั้งหมดที่จะใช้ในโอเปอเรเตอร์ความเท่ากัน หากต้องการเพิ่มโอกาสในการนำไปใช้ซ้ำในการค้นหา ให้จัดลำดับช่องตามลำดับความถี่ที่ลดลงของช่องในโอเปอเรเตอร์ความเท่ากันในการค้นหา
- ช่องทั้งหมดที่จะจัดเรียง (ตามลำดับเดียวกัน)
- ช่องที่จะใช้ในโอเปอเรเตอร์ช่วงหรือโอเปอเรเตอร์ความไม่เท่ากันตามลำดับความเลือกของข้อจำกัดการค้นหาที่ลดลง
- ช่องที่จะแสดงผลเป็นส่วนหนึ่งของการค้นหาในดัชนี: การรวมช่องดังกล่าวไว้ในดัชนีจะช่วยให้ดัชนีครอบคลุมการค้นหาและหลีกเลี่ยงการดึงข้อมูลเอกสารจากพื้นที่เก็บข้อมูลหลัก
บังคับให้สแกนดัชนีหรือตาราง
เมื่อคุณค้นหา Cloud Firestore ระบบจะใช้ดัชนีใดก็ตามที่
น่าจะทำให้การค้นหามีประสิทธิภาพมากขึ้นโดยอัตโนมัติ ดังนั้น คุณจึงไม่จำเป็นต้องระบุดัชนีสำหรับการค้นหา อย่างไรก็ตาม สำหรับการค้นหาที่มีความสำคัญต่อปริมาณงาน เราขอแนะนำให้คุณใช้ตัวเลือก forceIndex เพื่อให้ได้ประสิทธิภาพที่สม่ำเสมอมากขึ้น
ในบางกรณี Cloud Firestore อาจเลือกดัชนีที่ทำให้เวลาในการตอบสนองของการค้นหา
เพิ่มขึ้น หากคุณทำตามขั้นตอนการแก้ปัญหาการถดถอยของประสิทธิภาพแล้วและยืนยันว่าการลองใช้ดัชนีอื่นสำหรับการค้นหานั้นสมเหตุสมผล คุณสามารถระบุดัชนีได้โดยใช้ตัวเลือก forceIndex
คุณสามารถใช้ตัวเลือก forceIndex ในระยะอินพุตใดก็ได้ในการดำเนินการ
ไปป์ไลน์เพื่อลบล้างแผนการค้นหาเริ่มต้นของ Cloud Firestore's
และระบุดัชนีที่จะใช้ หรือเพื่อบังคับให้สแกนตาราง
บังคับใช้ดัชนีที่เฉพาะเจาะจง
หากต้องการบังคับให้การค้นหาใช้ดัชนีที่เฉพาะเจาะจง ให้ระบุรหัสดัชนีเป็นสตริงในตัวเลือก 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)
ตัวอย่าง Use Case สำหรับการบังคับใช้ดัชนีที่เฉพาะเจาะจงมีดังนี้
- การทดสอบประสิทธิภาพของดัชนีต่างๆ
- การตรวจสอบว่ามีการใช้ดัชนีที่เฉพาะเจาะจงซึ่งทราบว่ามีประสิทธิภาพสูงสุดสำหรับการค้นหา
- การลบล้างตัวเพิ่มประสิทธิภาพเมื่อตัวเลือกเริ่มต้นไม่เหมาะสมกับการค้นหาที่เฉพาะเจาะจง
หากไม่พบดัชนีที่ระบุ การค้นหาจะล้มเหลว
บังคับให้สแกนตาราง
การสแกนตารางจะอ่านเอกสารในคอลเล็กชันหรือกลุ่มคอลเล็กชันโดยไม่ใช้ดัชนีรอง หากต้องการบังคับให้สแกนตาราง ให้ตั้งค่า forceIndex เป็น primary
ตัวอย่างต่อไปนี้บังคับให้สแกนตาราง
// Force Planner to only do a Full-Table Scan
db.pipeline()
.collectionGroup({ collectionId: "customers", forceIndex: "primary" })
.limit(100)
คุณอาจใช้การสแกนตารางในกรณีต่อไปนี้
- สำหรับคอลเล็กชันขนาดเล็กมากซึ่งไม่คุ้มค่าที่จะใช้ดัชนี
- สำหรับการค้นหาที่เข้าถึงเอกสารส่วนใหญ่ในคอลเล็กชัน
- สำหรับการแก้ไขข้อบกพร่องและการเปรียบเทียบประสิทธิภาพ
ใช้ forceIndex กับ Query Explain
คุณสามารถใช้ Query Explain ในโหมด
explain หรือ analyze เพื่อสังเกตผลของ forceIndex ได้ดังนี้
- ตรวจสอบว่า Cloud Firestore ใช้ดัชนีที่ระบุใน
forceIndexโดย ตรวจสอบโหนดลีฟของแผนผังการดำเนินการสำหรับรหัสดัชนี - ยืนยันว่าโหนด
TableScanปรากฏในแผนเมื่อใช้forceIndex: "primary" - ในโหมด
analyzeให้เปรียบเทียบเมตริกประสิทธิภาพ เช่น เวลาในการตอบสนอง เอกสารที่สแกน และรายการดัชนีที่สแกน โดยใช้และไม่ใช้forceIndexเพื่อปรับแต่งประสิทธิภาพการค้นหา
แนวทางปฏิบัติแนะนำสำหรับ forceIndex
แม้ว่า forceIndex จะช่วยให้ควบคุมการดำเนินการค้นหาได้มากขึ้น แต่
Cloud Firestore's ตัวเพิ่มประสิทธิภาพการค้นหาโดยทั่วไปมีประสิทธิภาพสำหรับ Use Case ส่วนใหญ่
โปรดพิจารณาแนวทางปฏิบัติแนะนำต่อไปนี้เมื่อใช้ forceIndex
- ใช้
forceIndexอย่างรอบคอบ หากพบประสิทธิภาพที่ไม่เหมาะสมกับ แผนการค้นหาเริ่มต้น ให้ใช้ Query Explain เพื่อวิเคราะห์ปัญหา ก่อนที่จะบังคับใช้ดัชนี - เมื่อใช้
forceIndexให้ทดสอบการค้นหาด้วยปริมาณข้อมูลที่สมจริงเพื่อให้เข้าใจลักษณะประสิทธิภาพและต้นทุน - หลีกเลี่ยงการใช้
forceIndex: "primary"ในคอลเล็กชันขนาดใหญ่ในสภาพแวดล้อมการใช้งานจริง
ดูข้อมูลเพิ่มเติมเกี่ยวกับเอาต์พุตของการค้นหาที่ดำเนินการด้วย Query Explain ได้ที่ ข้อมูลอ้างอิงการดำเนินการค้นหา