ทำไมต้องจัดทำดัชนี
ทำความเข้าใจประเด็นสำคัญสองประเด็น
- แม้ว่าดัชนีจะดีกว่าไม่มีดัชนี แต่ดัชนีที่ถูกต้องนั้นดีกว่าอย่างใดอย่างหนึ่ง
- MongoDB จะใช้เพียงดัชนีเดียวต่อหนึ่งแบบสอบถามทำให้ดัชนีผสมกับฟิลด์ที่เหมาะสมเพื่อเรียงลำดับสิ่งที่คุณอาจต้องการใช้
ดัชนีไม่ฟรี พวกเขาใช้ความจำและกำหนดโทษประสิทธิภาพเมื่อทำการแทรกอัปเดตและลบ โดยปกติการตีประสิทธิภาพจะน้อยมาก (โดยเฉพาะเมื่อเทียบกับการเพิ่มประสิทธิภาพการอ่าน) แต่นั่นไม่ได้หมายความว่าเราจะไม่ฉลาดในการสร้างดัชนีของเรา
ดัชนีอย่างไร
การระบุกลุ่มของเขตข้อมูลที่ควรจัดทำดัชนีร่วมกันเป็นเรื่องเกี่ยวกับการทำความเข้าใจคิวรีที่คุณกำลังเรียกใช้ ลำดับของฟิลด์ที่ใช้สร้างดัชนีของคุณเป็นสิ่งสำคัญ ข่าวดีก็คือหากคุณได้รับคำสั่งผิดดัชนีจะไม่ถูกใช้เลยดังนั้นจึงง่ายต่อการระบุด้วยคำอธิบาย
ทำไมต้องจัดเรียง
คำถามของคุณอาจต้องมีการเรียงลำดับ แต่การจัดเรียงอาจเป็นการดำเนินการที่มีราคาแพงดังนั้นจึงเป็นเรื่องสำคัญที่จะต้องปฏิบัติต่อเขตข้อมูลที่คุณกำลังเรียงลำดับเช่นเดียวกับเขตข้อมูลที่คุณกำลังสืบค้น ดังนั้นจะเร็วกว่าถ้ามีดัชนี แม้ว่าจะมีข้อแตกต่างที่สำคัญอย่างหนึ่งคือฟิลด์ที่คุณกำลังเรียงลำดับจะต้องเป็นฟิลด์สุดท้ายในดัชนีของคุณ ข้อยกเว้นเพียงประการเดียวของกฎนี้คือถ้าช่องนั้นเป็นส่วนหนึ่งของข้อความค้นหาของคุณด้วยก็จะไม่ใช้กฎ must-be-last-rule
วิธีการจัดเรียง
คุณสามารถระบุการเรียงลำดับบนคีย์ทั้งหมดของดัชนีหรือในชุดย่อย อย่างไรก็ตามคีย์การจัดเรียงจะต้องอยู่ในลำดับเดียวกับที่ปรากฏในดัชนี ตัวอย่างเช่นรูปแบบคีย์ดัชนี {a: 1, b: 1} สามารถรองรับการจัดเรียงบน {a: 1, b: 1} แต่ไม่รองรับบน {b: 1, a: 1}
การเรียงลำดับต้องระบุทิศทางการจัดเรียงเดียวกัน (เช่นจากน้อยไปมาก / มากไปหาน้อย) สำหรับคีย์ทั้งหมดเป็นรูปแบบคีย์ดัชนีหรือระบุทิศทางการจัดเรียงย้อนกลับสำหรับคีย์ทั้งหมดเป็นรูปแบบคีย์ดัชนี ตัวอย่างเช่นรูปแบบคีย์ดัชนี {a: 1, b: 1} สามารถรองรับการจัดเรียงบน {a: 1, b: 1} และ {a: -1, b: -1} แต่ไม่รองรับ {a: -1 , b: 1}
สมมติว่ามีดัชนีเหล่านี้:
{ a: 1 }
{ a: 1, b: 1 }
{ a: 1, b: 1, c: 1 }
Example Index Used
db.data.find().sort( { a: 1 } ) { a: 1 }
db.data.find().sort( { a: -1 } ) { a: 1 }
db.data.find().sort( { a: 1, b: 1 } ) { a: 1, b: 1 }
db.data.find().sort( { a: -1, b: -1 } ) { a: 1, b: 1 }
db.data.find().sort( { a: 1, b: 1, c: 1 } ) { a: 1, b: 1, c: 1 }
db.data.find( { a: { $gt: 4 } } ).sort( { a: 1, b: 1 } ) { a: 1, b: 1 }
1, 3, 2, 6, 5, 4, 7
?