เพิ่มประสิทธิภาพการค้นหา

หากต้องการแก้ปัญหาการค้นหาที่ช้า ให้ใช้ Query Explain เพื่อรับแผนการดำเนินการค้นหา และโปรไฟล์การดำเนินการรันไทม์ ส่วนต่อไปนี้จะอธิบายขั้นตอนที่คุณสามารถทำได้เพื่อเพิ่มประสิทธิภาพการค้นหาโดยขึ้นอยู่กับโปรไฟล์การดำเนินการ

จำกัดจำนวนผลลัพธ์

ใช้ช่อง "บันทึกที่แสดงผล" ในแผนผังการดำเนินการเพื่อระบุว่าการค้นหาแสดงผลเอกสารจำนวนมากหรือไม่ พิจารณาจำกัดจำนวนเอกสารที่แสดงผลโดยใช้ระยะ limit(...) ซึ่งจะช่วยลดขนาดไบต์ที่ซีเรียลไลซ์ของผลลัพธ์เมื่อแสดงผลกับไคลเอ็นต์ผ่านเครือข่าย ในกรณีที่โหนด Limit อยู่ก่อนโหนด MajorSort เครื่องมือค้นหาจะรวมโหนด Limit และ MajorSort เข้าด้วยกัน และแทนที่การสร้างอินสแตนซ์และการจัดเรียงในหน่วยความจำทั้งหมดด้วยการจัดเรียง TopN ซึ่งจะช่วยลดข้อกำหนดด้านหน่วยความจำสำหรับการค้นหา

จำกัดขนาดเอกสารผลลัพธ์

พิจารณาจำกัดขนาดเอกสารที่แสดงผลโดยใช้ select(...) เพื่อแสดงผลเฉพาะช่องที่จำเป็น หรือใช้ remove_fields(...) เพื่อทิ้งช่องที่มีขนาดใหญ่เกินไป ซึ่งจะช่วยลดต้นทุนการประมวลผลและหน่วยความจำในการประมวลผลผลลัพธ์ระดับกลาง รวมถึงขนาดไบต์ที่ซีเรียลไลซ์ของผลลัพธ์เมื่อแสดงผลกับไคลเอ็นต์ผ่านเครือข่าย ในกรณีที่ช่องทั้งหมดที่อ้างอิงในการค้นหาครอบคลุมโดยดัชนีปกติ การดำเนินการนี้ยังช่วยให้การค้นหาครอบคลุมโดยการสแกนดัชนีได้อย่างสมบูรณ์ โดยไม่จำเป็นต้องดึงข้อมูลเอกสารจากพื้นที่เก็บข้อมูลหลัก

ใช้ดัชนี

ใช้คำแนะนำต่อไปนี้เพื่อตั้งค่าและเพิ่มประสิทธิภาพดัชนี

ระบุว่าการค้นหาใช้ดัชนีหรือไม่

คุณสามารถระบุว่าการค้นหาใช้ดัชนีหรือไม่โดยตรวจสอบโหนดลีฟในแผนผังการดำเนินการ หากโหนดลีฟของแผนผังการดำเนินการเป็นโหนด TableScanแสดงว่าการค้นหาไม่ได้ใช้ดัชนีและกำลังสแกนเอกสารจากพื้นที่เก็บข้อมูลหลัก หากมีการใช้ดัชนี โหนดลีฟของแผนผังการดำเนินการจะแสดงรหัสดัชนีและช่องดัชนีของดัชนี

ระบุดัชนีที่ดีกว่า

ดัชนีมีประโยชน์สำหรับการค้นหาหากสามารถลดจำนวนเอกสารที่เครื่องมือค้นหาต้องดึงข้อมูลจากพื้นที่เก็บข้อมูลหลัก หรือหากการจัดลำดับช่องสามารถตอบสนองข้อกำหนดการจัดเรียงของการค้นหาได้

หากมีการใช้ดัชนีสำหรับการค้นหา แต่เครื่องมือค้นหายังคงดึงข้อมูลและ ทิ้งเอกสารจำนวนมาก ซึ่งระบุได้จากโหนด Scan ที่แสดงผลบันทึกจำนวนมากตามด้วย โหนด Filter ที่แสดงผลบันทึกจำนวนน้อย แสดงว่า เพรดิเคตการค้นหาที่ตรงตามเงื่อนไขโดยใช้ดัชนีนั้นไม่ได้เลือก หากต้องการสร้างดัชนีที่เหมาะสมกว่า โปรดดูที่สร้างดัชนี

หากมีการใช้ดัชนีสำหรับการค้นหา แต่เครื่องมือค้นหายังคง จัดลำดับชุดผลลัพธ์ใหม่ในหน่วยความจำ ซึ่งระบุได้จาก โหนด MajorSort ในแผนผังการดำเนินการค้นหา แสดงว่าดัชนีที่ใช้ ไม่สามารถใช้เพื่อตอบสนองข้อกำหนดการจัดเรียงของการค้นหาได้ หากต้องการสร้างดัชนีที่เหมาะสมกว่า โปรดดูส่วนถัดไป

สร้างดัชนี

ทำตามเอกสารประกอบการจัดการดัชนีเพื่อ สร้างดัชนี หากต้องการให้การค้นหาสามารถใช้ดัชนีได้ ให้สร้างดัชนีปกติ (ไม่ใช่ Multikey) ที่มีช่องตามลำดับต่อไปนี้

  1. ช่องทั้งหมดที่จะใช้ในโอเปอเรเตอร์ความเท่ากัน หากต้องการเพิ่มโอกาสในการนำไปใช้ซ้ำในการค้นหา ให้จัดลำดับช่องตามลำดับความถี่ที่ลดลงของช่องในโอเปอเรเตอร์ความเท่ากันในการค้นหา
  2. ช่องทั้งหมดที่จะจัดเรียง (ตามลำดับเดียวกัน)
  3. ช่องที่จะใช้ในโอเปอเรเตอร์ช่วงหรือโอเปอเรเตอร์ความไม่เท่ากันตามลำดับความเลือกของข้อจำกัดการค้นหาที่ลดลง
  4. ช่องที่จะแสดงผลเป็นส่วนหนึ่งของการค้นหาในดัชนี: การรวมช่องดังกล่าวไว้ในดัชนีจะช่วยให้ดัชนีครอบคลุมการค้นหาและหลีกเลี่ยงการดึงข้อมูลเอกสารจากพื้นที่เก็บข้อมูลหลัก

บังคับให้สแกนดัชนีหรือตาราง

เมื่อคุณค้นหา 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 ได้ที่ ข้อมูลอ้างอิงการดำเนินการค้นหา