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