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

หากต้องการแก้ปัญหาการค้นหาที่ช้า ให้ใช้ 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

คุณสามารถใช้การอธิบายการค้นหาในโหมด explain หรือ analyze เพื่อสังเกตผลลัพธ์ของ forceIndex ได้ดังนี้

  • ยืนยันว่า Cloud Firestore ใช้ดัชนีที่ระบุใน forceIndex โดยตรวจสอบโหนดปลายสุดของแผนผังการดำเนินการเพื่อหารหัสดัชนี
  • ตรวจสอบว่าโหนด TableScan ปรากฏในแผนเมื่อใช้ forceIndex: "primary"
  • เมื่อใช้โหมด analyze ให้เปรียบเทียบเมตริกประสิทธิภาพ เช่น เวลาในการตอบสนอง เอกสารที่สแกน และรายการดัชนีที่สแกน โดยมีและไม่มี forceIndex เพื่อปรับแต่งประสิทธิภาพการค้นหา

แนวทางปฏิบัติแนะนำสำหรับforceIndex

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

  • ใช้ forceIndex อย่างรอบคอบ หากคุณพบว่าประสิทธิภาพต่ำกว่ามาตรฐานเมื่อใช้แผนการค้นหาเริ่มต้น ให้ใช้ Query Explain เพื่อวิเคราะห์ปัญหาก่อนที่จะบังคับใช้ดัชนี
  • เมื่อใช้ forceIndex โปรดทดสอบการค้นหาด้วยปริมาณข้อมูลจริงเพื่อทำความเข้าใจประสิทธิภาพและลักษณะค่าใช้จ่าย
  • หลีกเลี่ยงการใช้ forceIndex: "primary" กับคอลเล็กชันขนาดใหญ่ในสภาพแวดล้อมฮาร์ดแวร์และซอฟต์แวร์

ดูข้อมูลเพิ่มเติมเกี่ยวกับเอาต์พุตของการค้นหาที่ดำเนินการด้วย Query Explain ได้ที่ข้อมูลอ้างอิงการดำเนินการค้นหา