Sorting with indexes
มี 2 แบบ
In memory
- เวลา Sort ปกติ (In-memory) จะมีการโหลด document จาก disk เข้า RAM
- แบบใช้ index จะเร็วกว่า แต่จะ sort ตาม key ที่ถูกใช้ทำ indexes เท่านั้น
Workshop
import ข้อมูล (ถ้ายังไม่ได้ทำ)
- เปิด Command Prompt หรือ Terminal มาที่โฟลเดอร์ B-Performance
- รันคำสั่ง
mongoimport --db nfmongop --collection people --file people.json
ทดสอบการ sort
อย่าลืมคำสั่ง use nfmongop
นะ
- รันคำสั่งด้านล่าง และสังเกตว่ามีการใช้
.sort({})
ที่เรียกใช้ index ของเรา
db.people.find({}, { _id : 0, last_name: 1, first_name: 1, ssn: 1 }).sort({ ssn: 1 })
- รันคำสั่งด้านล่าง เพื่อดูข้อมูลการทำงานล่าสุดบน Collection
var exp = db.people.explain('executionStats')
exp.find({}, { _id : 0, last_name: 1, first_name: 1, ssn: 1 }).sort({ ssn: 1 })
- สังเกตค่า winningPlan กับ executionStats จะเห็นว่า totalKeysExamined มีการใช้งาน และสังเกตเวลาท่ี่ใช้
- รันคำสั่งใหม่ โดยใช้ field อื่นที่ไม่ได้ทำ index แทน
exp.find({}, { _id : 0, last_name: 1, first_name: 1, ssn: 1 }).sort({ first_name: 1 })
- สังเกตค่า winningPlan กับ executionStats ในส่วนของ executionTimeMillis และ totalKeysExamined
- ทดลองรันคำสั่ง sort แบบ Descending
exp.find({}, { _id : 0, last_name: 1, first_name: 1, ssn: 1 }).sort({ ssn: -1 })
- สังเกตค่า winningPlan กับ executionStats ในส่วนของ executionTimeMillis และ totalKeysExamined
ทดสอบการทำงาน Indexes แบบ Descending
- รันคำสั่งด้านล่างเพื่อ drop index ทิ้ง
- สร้าง index ด้วย field ssn เดิม แต่คราวนี้เป็นแบบ Descending (ค่าเป็น -1)
db.people.createIndex({ ssn: -1 })
- ทดสอบรันคำสั่งด้านล่างอีกครั้ง
exp.find( { ssn : /^555/ }, { _id : 0, last_name: 1, first_name: 1, ssn: 1 } ).sort( { ssn : -1 } )
สังเกตค่า direction ใน winningPlan