MongoDB การสร้างดัชนี: createIndex() และ dropIndex()

⚡ สรุปอย่างชาญฉลาด

MongoDB ดัชนีจะจัดเก็บชุดย่อยที่เรียงลำดับของฟิลด์ในคอลเลกชัน เพื่อให้การค้นหาสามารถค้นหาเอกสารได้โดยไม่ต้องสแกนทุกระเบียน เมธอด createIndex, getIndexes และ dropIndex จะสร้าง แสดงรายการ และลบโครงสร้างที่สำคัญต่อประสิทธิภาพเหล่านี้

  • 🚀 วัตถุประสงค์: ดัชนีช่วยให้ MongoDB ข้ามขั้นตอนการสแกนคอลเลกชันทั้งหมดเพื่อการอ่านที่เร็วขึ้น
  • 🛠️ สร้างดัชนี: สร้างดัชนีข้อมูลแบบฟิลด์เดียวหรือแบบผสม โดยเรียงลำดับจากน้อยไปมากหรือจากมากไปน้อย
  • 🔍 รับดัชนี: แสดงรายการดัชนีทั้งหมดในคอลเลกชัน รวมถึง _id เริ่มต้น
  • 🗑️ dropIndex: ลบดัชนีหนึ่งรายการ; dropIndexes จะลบดัชนีทั้งหมด ยกเว้น _id
  • 🇧🇷 การแลกเปลี่ยน: ดัชนีจำนวนมากเกินไปจะทำให้การแทรก การอัปเดต และการลบข้อมูลช้าลง
  • 🤖 การปรับแต่ง AI: ผู้ช่วยจะแนะนำและสร้างดัชนีที่เหมาะสมโดยอัตโนมัติ

MongoDB การสร้างดัชนี createIndex dropIndex

สิ่งที่เป็น MongoDB ดัชนี?

ดัชนีมีความสำคัญมากในทุกฐานข้อมูลและด้วย MongoDB มันก็ไม่ต่างกัน ด้วยการใช้ดัชนี การดำเนินการค้นหาใน MongoDB มีประสิทธิภาพมากขึ้น

หากคุณมีชุดเอกสารหลายพันฉบับโดยไม่มีดัชนี และคุณต้องการค้นหาเอกสารบางฉบับ ในกรณีเช่นนี้ MongoDB จะต้องสแกนทั้งคอลเลกชันเพื่อค้นหาเอกสาร แต่ถ้าคุณมีดัชนี MongoDB จะใช้ดัชนีเหล่านี้เพื่อจำกัดจำนวนเอกสารที่ต้องค้นหาในคอลเลกชัน

ดัชนีเป็นชุดข้อมูลพิเศษที่จัดเก็บข้อมูลเพียงบางส่วนจากชุดข้อมูลทั้งหมด เนื่องจากข้อมูลเป็นเพียงบางส่วน จึงทำให้การอ่านข้อมูลนั้นง่ายขึ้น ชุดข้อมูลบางส่วนนี้จะจัดเก็บค่าของฟิลด์เฉพาะ หรือชุดของฟิลด์ โดยเรียงลำดับตามค่าของฟิลด์นั้น

การทำความเข้าใจผลกระทบของดัชนี

แม้ว่าในเบื้องต้นจะแสดงให้เห็นว่าดัชนีมีประโยชน์ต่อการค้นหาข้อมูล แต่การมีดัชนีมากเกินไปอาจทำให้การทำงานอื่นๆ เช่น การแทรก การลบ และการอัปเดตข้อมูลช้าลงได้

หากมีการดำเนินการเพิ่ม ลบ และอัปเดตเอกสารบ่อยครั้ง ดัชนีก็จะต้องเปลี่ยนแปลงบ่อยเช่นกัน ซึ่งจะทำให้เกิดภาระเพิ่มขึ้นสำหรับระบบจัดเก็บข้อมูล

ตัวอย่างด้านล่างแสดงให้เห็นว่าค่าฟิลด์ใดบ้างที่สามารถใช้เป็นดัชนีในชุดข้อมูลได้ ดัชนีอาจสร้างขึ้นจากฟิลด์เดียวในชุดข้อมูล หรืออาจสร้างขึ้นจากหลายฟิลด์ในชุดข้อมูลก็ได้

ในตัวอย่างด้านล่าง Employeeid คือ “1” และ EmployeeCode “AA” ใช้สำหรับจัดทำดัชนีเอกสารในชุดเอกสาร ดังนั้นเมื่อมีการค้นหาด้วยคำค้นหา ดัชนีเหล่านี้จะถูกนำมาใช้เพื่อค้นหาเอกสารที่ต้องการในชุดเอกสารได้อย่างรวดเร็วและมีประสิทธิภาพ

ดังนั้นแม้ว่าคำค้นหาจะอิงตามพนักงานก็ตามCode “AA” เอกสารนั้นจะถูกส่งคืน

การทำความเข้าใจผลกระทบของดัชนี

วิธีการสร้างดัชนี: createIndex()

การสร้างดัชนีใน MongoDB ทำได้โดยใช้ createIndex วิธี

ตัวอย่างต่อไปนี้แสดงวิธีการเพิ่มดัชนีลงในคอลเลกชัน สมมติว่าเรามีคอลเลกชันพนักงาน (Employee) เดิม ซึ่งมีชื่อฟิลด์ว่า “Employeeid” และ “EmployeeName”

สร้างดัชนีด้วยคำสั่ง createIndex

db.Employee.createIndex({Employeeid:1})

Code คำอธิบาย:

  1. การขอ createIndex วิธีการใช้เพื่อสร้างดัชนีตาม “Employeeid” ของเอกสาร
  2. พารามิเตอร์ “1” ระบุว่าเมื่อสร้างดัชนีโดยใช้ค่าฟิลด์ “Employeeid” ค่าเหล่านั้นควรเรียงลำดับจากน้อยไปมาก โปรดทราบว่านี่แตกต่างจากฟิลด์ _id (ซึ่งระบุเอกสารแต่ละฉบับได้อย่างเฉพาะเจาะจง) MongoDB สร้างโดยอัตโนมัติ เอกสารจะถูกจัดเรียงตาม Employeeid ไม่ใช่ตามฟิลด์ _id อีกต่อไป

หากดำเนินการคำสั่งสำเร็จ จะแสดงผลลัพธ์ดังต่อไปนี้:

Output:

เอาต์พุตการสร้างดัชนี

  1. ค่า numIndexesBefore: 1 บ่งชี้จำนวนค่าฟิลด์ในดัชนีก่อนที่จะเรียกใช้คำสั่ง แต่ละคอลเลกชันจะมีฟิลด์ _id ซึ่งนับเป็นค่าฟิลด์ด้วย ดังนั้น numIndexesBefore จึงเท่ากับ 1
  2. ค่า numIndexesAfter: 2 ระบุจำนวนค่าฟิลด์ในดัชนีหลังจากที่เรียกใช้คำสั่งแล้ว
  3. ผลลัพธ์ “ok: 1” ระบุว่าการดำเนินการสำเร็จ และดัชนีใหม่จะถูกเพิ่มเข้าไปในคอลเลกชัน

โค้ดด้านบนแสดงวิธีการสร้างดัชนีโดยอิงจากค่าฟิลด์เดียว แต่เราสามารถสร้างดัชนีโดยอิงจากค่าฟิลด์หลายค่าได้เช่นกัน ตัวอย่างต่อไปนี้แสดงวิธีการทำเช่นนั้น:

สร้างดัชนีแบบผสมบนฟิลด์หลายฟิลด์

db.Employee.createIndex({Employeeid:1, EmployeeName:1})

เมธอด createIndex ในปัจจุบันคำนึงถึงค่าฟิลด์หลายค่า ซึ่งจะทำให้ดัชนีถูกสร้างขึ้นโดยอิงจาก “Employeeid” และ “EmployeeName” Employeeid:1 และ EmployeeName:1 บ่งชี้ว่าควรสร้างดัชนีจากค่าฟิลด์ทั้งสองนี้ โดย :1 แสดงถึงลำดับจากน้อยไปมาก นี่เรียกว่าดัชนีแบบผสม (compound index)

วิธีการค้นหาดัชนี: getIndexes()

การค้นหาดัชนีใน MongoDB ทำได้โดยใช้ รับดัชนี วิธีการดังกล่าว ตัวอย่างต่อไปนี้แสดงให้เห็นว่าสามารถทำได้อย่างไร:

ค้นหาดัชนีด้วย getIndexes

db.Employee.getIndexes()

เมธอด getIndexes ใช้เพื่อค้นหาดัชนีทั้งหมดในคอลเลกชัน

หากดำเนินการคำสั่งสำเร็จ จะแสดงผลลัพธ์ดังต่อไปนี้:

Output:

เอาต์พุต getIndexes

ผลลัพธ์ที่ได้คือเอกสารที่แสดงให้เห็นว่ามีดัชนีสองรายการในคอลเลกชัน ได้แก่ ฟิลด์ _id และฟิลด์ Employeeid เครื่องหมาย :1 บ่งชี้ว่าค่าฟิลด์ในดัชนีถูกสร้างขึ้นในลำดับจากน้อยไปมาก

วิธีการลบดัชนี: dropIndex()

การลบดัชนีใน MongoDB ทำได้โดยใช้ ดรอปอินเด็กซ์ วิธีการดังกล่าว ตัวอย่างต่อไปนี้แสดงให้เห็นว่าสามารถทำได้อย่างไร:

ลบดัชนีด้วย dropIndex

db.Employee.dropIndex({Employeeid:1})

เมธอด dropIndex รับค่าฟิลด์ที่ต้องการลบออกจากดัชนี

หากดำเนินการคำสั่งสำเร็จ จะแสดงผลลัพธ์ดังต่อไปนี้:

Output:

เอาต์พุต dropIndex

  1. nIndexesWas: 3 ระบุจำนวนค่าฟิลด์ในดัชนีก่อนที่จะรันคำสั่ง แต่ละคอลเลกชันจะมีฟิลด์ _id ซึ่งนับเป็นค่าฟิลด์ด้วยเช่นกัน
  2. เอาท์พุต ok: 1 ระบุว่าการดำเนินการสำเร็จ และฟิลด์ “Employeeid” จะถูกลบออกจากดัชนี

หากต้องการลบดัชนีทั้งหมดในคอลเลกชันพร้อมกัน สามารถใช้คำสั่ง dropIndexes ได้ ตัวอย่างต่อไปนี้แสดงวิธีการทำ:

ลบดัชนีทั้งหมดด้วยคำสั่ง dropIndexes

db.Employee.dropIndexes()

เมธอด dropIndexes จะปล่อยดัชนีทั้งหมดยกเว้นดัชนี _id

หากดำเนินการคำสั่งสำเร็จ จะแสดงผลลัพธ์ดังต่อไปนี้:

Output:

เอาต์พุต dropIndexes

  1. ค่า nIndexesWas: 2 บ่งชี้จำนวนค่าฟิลด์ในดัชนีก่อนที่จะเรียกใช้คำสั่ง
  2. แต่ละคอลเลกชันจะมีฟิลด์ _id ซึ่งนับเป็นค่าฟิลด์เช่นกันและจะไม่ถูกลบออก MongoDBนั่นคือสิ่งที่ข้อความนี้บ่งบอก
  3. เอาท์พุต ok: 1 ระบุว่าการดำเนินการสำเร็จ

คำถามที่พบบ่อย

ดัชนีแบบฟิลด์เดียวจะเรียงลำดับข้อมูลในฟิลด์เดียวและเหมาะสำหรับการค้นหาที่กรองข้อมูลเฉพาะฟิลด์นั้นเท่านั้น ส่วนดัชนีแบบผสมจะครอบคลุมหลายฟิลด์ในโครงสร้างเดียวและเหมาะสำหรับการค้นหาที่กรองหรือเรียงลำดับข้อมูลในฟิลด์เหล่านั้นพร้อมกัน ดัชนีแบบผสมรองรับได้สูงสุด 32 ฟิลด์

ฟิลด์ _id คือ MongoDBเนื่องจากเป็นคีย์หลักของคอลเลกชัน ดังนั้นทุกคอลเลกชันจึงได้รับดัชนี _id ที่ไม่ซ้ำกันโดยอัตโนมัติ และไม่สามารถลบได้ นั่นเป็นเหตุผลที่ numIndexesBefore เริ่มต้นที่ 1 แม้ก่อนที่คุณจะเพิ่มดัชนีแบบกำหนดเองใดๆ

เรียกใช้คิวรีด้วย .explain(“executionStats”) ในแผนการทำงานที่ชนะ การกำหนดขั้นตอน IXSCAN หมายความว่ามีการใช้ดัชนี ในขณะที่ COLLSCAN หมายความว่า MongoDB สแกนเอกสารทุกฉบับแล้ว และการจัดทำดัชนีใหม่น่าจะช่วยได้

ใช้ขั้นตอนการรวมข้อมูล $indexStats เพื่อดูว่าแต่ละดัชนีถูกเข้าถึงบ่อยแค่ไหน ดัชนีที่มีการใช้งานต่ำมากจะสิ้นเปลืองพื้นที่ดิสก์และเขียนข้อมูลช้า ดังนั้นให้ลบออกด้วย dropIndex เพื่อให้คอลเลกชันมีขนาดเล็กลง

เครื่องมือ AI วิเคราะห์บันทึกการค้นหาที่ช้าและแนะนำฟิลด์ที่ควรจัดทำดัชนี MongoDBเครื่องมือ Performance Advisor ของ 's จัดอันดับคำแนะนำดัชนีตามผลกระทบ ช่วยping คุณเพิ่มดัชนีที่มีค่าสูงและข้ามดัชนีที่ซ้ำซ้อน

ใช่แล้ว ผู้ช่วย AI Copilot จะแปลงคำขอภาษาอังกฤษธรรมดาให้เป็นไวยากรณ์ createIndex ที่ถูกต้อง รวมถึงการเรียงลำดับคีย์จากน้อยไปมากหรือจากมากไปน้อย และลำดับฟิลด์แบบผสม จากนั้นจะอธิบายดัชนีที่ได้

ESR ย่อมาจาก Equality, Sort, Range เมื่อสร้างดัชนีแบบผสม ให้วางฟิลด์ที่ตรงกันแบบเท่ากันไว้ก่อน จากนั้นจึงวางฟิลด์ที่เรียงลำดับ และสุดท้ายคือตัวกรองช่วง การเรียงลำดับนี้จะช่วยให้ MongoDB ใช้ดัชนีอย่างมีประสิทธิภาพที่สุด

การค้นหาแบบครอบคลุมจะได้รับคำตอบทั้งหมดจากดัชนี โดยไม่ต้องอ่านเอกสาร เมื่อทุกฟิลด์ในตัวกรองและการฉายภาพอยู่ในดัชนีเดียวกัน MongoDB ให้ผลลัพธ์ได้เร็วขึ้น

สรุปโพสต์นี้ด้วย: