เมื่อคอลเลกชันใหญ่และค้นหาช้า ให้สร้างดัชนี (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 บ่อย