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

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

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

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

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

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

ใช้ดัชนี

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

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

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

ระบุว่าดัชนีที่ใช้สามารถเพิ่มประสิทธิภาพได้หรือไม่

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

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

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

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

คุณสามารถเพิ่มประสิทธิภาพคำค้นหา $lookup ได้โดยการเพิ่มดัชนีลงในคอลเล็กชัน from ซึ่งจะช่วยให้การดำเนินการค้นหาเอกสารที่ตรงกันได้อย่างมีประสิทธิภาพโดยไม่ต้องสแกน ทั้งคอลเล็กชัน

$lookup กับ localField และ foreignField

หากคุณใช้ตัวเลือก localField และ foreignField ใน$lookup ขั้นตอน ให้สร้างดัชนีใน foreignField ในคอลเล็กชัน from

$lookup ที่มีไปป์ไลน์ที่ซ้อนกัน

หากคุณใช้ตัวเลือก pipeline ในขั้นตอน $lookup ที่มีขั้นตอน $match ให้สร้างดัชนีในฟิลด์ที่เกี่ยวข้องกับคอลเล็กชันภายนอกเพื่อหลีกเลี่ยง การสแกนตารางทั้งหมด

  • สำหรับ$matchที่มีความหมายของตัวกรอง (เช่น {$match: {a: true}}) ให้สร้างดัชนีในฟิลด์ที่เกี่ยวข้องในคอลเล็กชันภายนอก (a)
  • สำหรับ$match สเตจที่มีความหมายของการรวมที่เปรียบเทียบฟิลด์กับค่าคงที่ (เช่น {$match: {$expr: {$gt: [a, 10]}}}) หรือกับการเปรียบเทียบความเท่ากัน (eq หรือ in) ระหว่างฟิลด์และตัวแปรที่กำหนดไว้ใน let (เช่น {$match: {$expr: {$eq: [a, "$$a"]}}}) ให้สร้างดัชนีในฟิลด์ที่เกี่ยวข้องในคอลเล็กชันภายนอก โปรดทราบว่าระบบจะไม่ใช้ดัชนีแบบหลายคีย์ในการวางแผน

สร้างดัชนี

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

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

สําหรับการค้นหาที่เกี่ยวข้องกับการกรองและการจัดเรียงฟิลด์อาร์เรย์ ให้ลองสร้าง ดัชนีแบบหลายคีย์

ใช้คำแนะนำการค้นหา

หากคุณสร้างดัชนีที่เหมาะสมกว่าสําหรับคําค้นหา แต่เครื่องมือค้นหาไม่ได้ใช้ดัชนีนั้น คุณสามารถลบล้างค่ากําหนดดัชนีของเครื่องมือค้นหาได้โดยใช้คำใบ้การค้นหา

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