หากต้องการแก้ปัญหาการค้นหาที่ช้า ให้ใช้ 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 ได้ที่ข้อมูลอ้างอิงการดำเนินการค้นหา