ฉันประสบปัญหาด้านประสิทธิภาพบน API ที่ฉันกำลังพัฒนาโดยใช้ NodeJS+Express+MongoDB
ในการรันการรวมด้วย $match กับผลิตภัณฑ์ใดผลิตภัณฑ์หนึ่ง ประสิทธิภาพดี แต่สำหรับการค้นหาแบบเปิดจะช้ามาก
ฉันต้องการเรียกใช้กลุ่มในสองคอลัมน์: ประเทศและผู้ส่งออก จากนั้นดึงผลลัพธ์ที่จำกัดไว้ที่ 3 ผลลัพธ์ต่อกลุ่มในประเทศ
ข้อกำหนด: จำนวนรวมของผู้ส่งออกที่ไม่ซ้ำกันจากแต่ละประเทศ พร้อมด้วยบันทึก 3 รายการจากแต่ละประเทศ
เมื่อรัน explain()
บน aggregate function
ของฉัน ฉันได้รับตัวชี้สำคัญต่อไปนี้ที่แจ้งว่าการค้นหาของฉันช้า โปรดแก้ไขฉันหากฉันผิด
"indexFilterSet": false
"winningPlan": {
"stage": "COLLSCAN",
"direction": "forward"
},
ดำเนินการค้นหาในบันทึก 9,264,947
และเวลาที่ใช้คือประมาณ 32 seconds
ฉันได้ลองใช้ดัชนีแบบผสมและดัชนีฟิลด์เดี่ยวแล้ว แต่ก็ไม่ได้ช่วยอะไรเลย เนื่องจากฉันรู้สึกว่าดัชนีไม่ได้ใช้โดยที่ $match
ว่างเปล่า {}
ด้านล่างนี้คือข้อความค้นหาที่ฉันเรียกใช้บน mongoDB โดยใช้ไดรเวอร์ mongoose
Model.aggregate([
{"$match" : query},
{ $group : {_id: {country: "$Country", exporter: "$Exporter"}, id: {$first: "$_id"}, product: { $first: "$Description" }}},
{ $group : {_id: "$_id.country", data: {$push: { id: "$id", company: "$_id.exporter", product: "$product" }}, count:{$sum:1}}},
{ "$sort": { "count": -1 } },
{
$project: {
"data": { "$slice": [ "$data", 3 ] },
"_id": 1,
"count": 1
}
},
]).allowDiskUse(true).explain()
โดยที่ ข้อความค้นหา ถูกสร้างขึ้นแบบไดนามิก และโดยค่าเริ่มต้นจะว่างเปล่า {}
สำหรับการค้นหาทั่วทั้งคอลเลกชัน ฟิลด์ที่มีการจัดทำดัชนีคือ
ดัชนีผสม:
{Country: 1, Exporter: 1}
ดัชนีข้อความ:
{Description: "text"}
คำตอบอธิบาย () แบบเต็ม:
{
"success": "Successfull",
"status": 200,
"data": {
"stages": [
{
"$cursor": {
"query": {},
"fields": {
"Country": 1,
"Description": 1,
"Exporter": 1,
"_id": 1
},
"queryPlanner": {
"plannerVersion": 1,
"namespace": "db.OpenExportData",
"indexFilterSet": false,
"parsedQuery": {},
"winningPlan": {
"stage": "COLLSCAN",
"direction": "forward"
},
"rejectedPlans": []
}
}
},
{
"$group": {
"_id": {
"country": "$Country",
"exporter": "$Exporter"
},
"id": {
"$first": "$_id"
},
"product": {
"$first": "$Description"
}
}
},
{
"$group": {
"_id": "$_id.country",
"data": {
"$push": {
"id": "$id",
"company": "$_id.exporter",
"product": "$product"
}
},
"count": {
"$sum": {
"$const": 1
}
}
}
},
{
"$sort": {
"sortKey": {
"count": -1
}
}
},
{
"$project": {
"_id": true,
"count": true,
"data": {
"$slice": [
"$data",
{
"$const": 3
}
]
}
}
}
],
"ok": 1
}
}
ขนาดคอลเลกชัน : 9,264,947 บันทึก & 10.2 GB
เวลาตอบสนอง : 32154 ms
ข้อความค้นหาเริ่มช้าลงเนื่องจากขนาดคอลเลกชันของฉันเพิ่มขึ้น