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

$in เร็วกว่าการค้นหาหลายครั้งใน MongoDB หรือไม่?

ใช่ $in เร็วกว่าการ query หลายครั้ง (multiple single searches) เพราะทำใน 1 round-trip และใช้ดัชนีได้อย่างมีประสิทธิภาพ

> db.demo653.insertOne({subject: "MySQL"});
{ "acknowledged" : true, "insertedId" : ObjectId("5ea04b274deddd72997713c0") }
> db.demo653.insertOne({subject: "MongoDB"});
{ "acknowledged" : true, "insertedId" : ObjectId("5ea04b304deddd72997713c1") }
> db.demo653.insertOne({subject: "Java"});
{ "acknowledged" : true, "insertedId" : ObjectId("5ea04b354deddd72997713c2") }
> db.demo653.insertOne({subject: "C"});
{ "acknowledged" : true, "insertedId" : ObjectId("5ea04b384deddd72997713c3") }
> db.demo653.insertOne({subject: "C++"});
{ "acknowledged" : true, "insertedId" : ObjectId("5ea04b3b4deddd72997713c4") }

แสดงข้อมูล:

> db.demo653.find();

คิวรี $in ค้นหา 3 วิชาพร้อมกัน

> db.demo653.find({subject: {$in: ["MySQL", "C++", "C"]}});

ผลลัพธ์:


ทำไม $in เร็วกว่า?

ข้อควรระวัง

  • $in กับอาร์เรย์ใหญ่เกิน 10,000 ค่า อาจช้าลง (MongoDB จำกัด)
  • หากค่ามากมาย ควรพิจารณา $or หรือแยกคิวรี
  • สร้างดัชนีบนฟิลด์ที่ใช้ $in

ตัวอย่างเปรียบเทียบใน Code

// ช้า - 3 round trips
const mysql = await db.find({subject: "MySQL"});
const cpp = await db.find({subject: "C++"});
const c = await db.find({subject: "C"});

// เร็ว - 1 round trip
const results = await db.find({subject: {$in: ["MySQL", "C++", "C"]}});
วิธีRound TripsIndex UsageNetwork Overhead
Multiple find()N ครั้งใช้ index ทุกครั้งสูง (N requests)
Single $in1 ครั้งใช้ index 1 ครั้ง (OR scan)ต่ำ (1 request)