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

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

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

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

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

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

ใช้ดัชนี

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

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

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

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

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

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

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

สร้างดัชนี

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

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

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

เมื่อคุณค้นหา 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" กับคอลเล็กชันขนาดใหญ่ในสภาพแวดล้อมการใช้งานจริง