Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MongoDB

แก้ปัญหา MongoDB คอลเลกชันใหญ่ ค้นหาช้า ด้วย Index

เมื่อคอลเลกชันใหญ่และค้นหาช้า ให้สร้างดัชนี (Index) บนฟิลด์ที่ใช้ในเงื่อนไขค้นหา

> db.demo661.createIndex({ListOfName: 1});
{ "createdCollectionAutomatically" : true, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
> db.demo661.insertOne({_id: 1, ListOfName: ["John", "Robert", "David"]});
{ "acknowledged" : true, "insertedId" : 1 }
> db.demo661.insertOne({_id: 2, ListOfName: ["Mike", "Sam"]});
{ "acknowledged" : true, "insertedId" : 2 }
> db.demo661.insertOne({_id: 3, ListOfName: ["John", "David", "Bob"]});
{ "acknowledged" : true, "insertedId" : 3 }

แสดงข้อมูล:

> db.demo661.find();

คิวรีค้นหาที่มีทั้ง "John" และ "David" ใน ListOfName

> db.demo661.find({"ListOfName": {$all: ["John", "David"]}});

ผลลัพธ์:


ทำไม Index ช่วยได้?

  • MongoDB สร้าง Multikey Index สำหรับฟิลด์อาร์เรย์โดยอัตโนมัติ
  • แต่ละค่าในอาร์เรย์จะมี entry ในดัชนี
  • คิวรี $all สามารถใช้ดัชนีหา intersection ได้

ตรวจสอบว่าใช้ Index จริง

db.demo661.find({"ListOfName": {$all: ["John", "David"]}}).explain("executionStats");

ดู winningPlan.stage: "IXSCAN" แสดงว่าใช้ Index Scan ไม่ใช่ Collection Scan

ข้อควรระวัง

  • Index ใช้พื้นที่ดิสก์และหน่วยความจำ
  • Index เยอะเกินไปทำให้ Write ช้าลง
  • ควรสร้าง Index เฉพาะฟิลด์ที่ Query บ่อย