หากต้องการแก้ปัญหาการค้นหาที่ช้า ให้ใช้ Query Explain เพื่อรับแผนการดำเนินการค้นหาและโปรไฟล์การดำเนินการรันไทม์ ส่วนต่อไปนี้จะอธิบายขั้นตอนที่คุณทำได้เพื่อเพิ่มประสิทธิภาพการค้นหา โดยขึ้นอยู่กับโปรไฟล์การดำเนินการ
จำกัดจำนวนผลลัพธ์
ใช้ฟิลด์ "ระเบียนที่แสดงผล" ในแผนผังการดำเนินการเพื่อระบุว่าคําค้นหาแสดงเอกสารจํานวนมากหรือไม่ คุณอาจจำกัดจำนวนเอกสารที่แสดงผลโดยใช้$limit ซึ่งจะช่วยลดขนาดไบต์ที่แปลงเป็นอนุกรมของผลลัพธ์
เมื่อแสดงผลต่อไคลเอ็นต์ผ่านเครือข่าย ในกรณีที่โหนด 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"]}}}) ให้สร้างดัชนีในฟิลด์ที่เกี่ยวข้องในคอลเล็กชันภายนอก โปรดทราบว่าระบบจะไม่ใช้ดัชนีแบบหลายคีย์ ในการวางแผน
สร้างดัชนี
ทำตามเอกสารประกอบการจัดการดัชนีเพื่อสร้างดัชนี หากต้องการให้การค้นหาใช้ดัชนีได้ ให้สร้างดัชนีปกติ (ไม่ใช่ดัชนีหลายคีย์) โดยมีฟิลด์ตามลำดับต่อไปนี้
- ฟิลด์ทั้งหมดที่จะใช้ในตัวดำเนินการเท่ากับ หากต้องการเพิ่มโอกาสในการ นำกลับมาใช้ใหม่ในการค้นหา ให้จัดเรียงฟิลด์ตามลำดับการเกิดของฟิลด์ ในตัวดำเนินการเท่ากับในการค้นหา
- ฟิลด์ทั้งหมดที่จะจัดเรียง (ในลำดับเดียวกัน)
- ฟิลด์ที่จะใช้ในโอเปอเรเตอร์ช่วงหรือโอเปอเรเตอร์ความไม่เท่ากันในลำดับการลดลงของความสามารถในการเลือกข้อจำกัดการค้นหา
- ฟิลด์ที่จะแสดงเป็นส่วนหนึ่งของการค้นหาในดัชนี การรวมฟิลด์ดังกล่าวไว้ในดัชนีจะช่วยให้ดัชนีครอบคลุมการค้นหาและหลีกเลี่ยงการดึงข้อมูลเอกสารจากที่เก็บข้อมูลหลัก
สำหรับการค้นหาที่เกี่ยวข้องกับการกรองและการจัดเรียงฟิลด์อาร์เรย์ ให้ลองสร้าง ดัชนีหลายคีย์
ใช้คำแนะนำการค้นหา
หากคุณสร้างดัชนีที่เหมาะสมกว่าสําหรับการค้นหา แต่เครื่องมือค้นหาไม่ใช้ดัชนีนั้น คุณสามารถลบล้างค่ากําหนดดัชนีของเครื่องมือค้นหาได้โดยใช้คำแนะนำในการค้นหา
ดูข้อมูลเพิ่มเติมเกี่ยวกับเอาต์พุตของการค้นหาที่ดำเนินการด้วย Query Explain ได้ที่ข้อมูลอ้างอิงการดำเนินการค้นหา