ภาพรวมดัชนี

หน้านี้อธิบายการจัดทำดัชนีสำหรับ Cloud Firestore Cloud Firestore ไม่ได้สร้างดัชนีใดๆ โดยค่าเริ่มต้น หากต้องการปรับปรุงประสิทธิภาพของฐานข้อมูล ให้สร้างดัชนีสำหรับคำค้นหาที่ใช้บ่อยที่สุด

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

คำจำกัดความและโครงสร้างของดัชนี

ดัชนีประกอบด้วยสิ่งต่อไปนี้

  • รหัสคอลเล็กชัน
  • รายการฟิลด์ในคอลเล็กชันที่ระบุ
  • ลำดับจากน้อยไปมากหรือจากมากไปน้อยสำหรับแต่ละฟิลด์

นอกจากนี้ ดัชนียังเปิดใช้ตัวเลือก sparse, multikey หรือ unique ได้ด้วย

การจัดเรียงดัชนี

ลำดับและทิศทางการจัดเรียงของแต่ละฟิลด์จะกำหนดดัชนีโดยไม่ซ้ำกัน ตัวอย่างเช่น ดัชนีต่อไปนี้เป็นดัชนี 2 รายการที่แตกต่างกันและใช้แทนกันไม่ได้

การรวบรวม ช่อง
เมือง ประเทศ (จากน้อยไปมาก), ประชากร (จากมากไปน้อย)
เมือง ประชากร (จากมากไปน้อย) ประเทศ (จากน้อยไปมาก)

เมื่อสร้างดัชนีเพื่อรองรับการค้นหา ให้ใส่ฟิลด์ตามลำดับเดียวกับการค้นหา

ความหนาแน่นของดัชนี

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

ดัชนีแบบกระจัดกระจาย

ดัชนีแบบ Sparse จะจัดทำดัชนีเฉพาะเอกสารในคอลเล็กชันที่มีค่า (รวมถึงค่า Null) สำหรับช่องที่จัดทำดัชนีอย่างน้อย 1 ช่อง ดัชนีแบบกระจัดกระจายช่วยลดต้นทุนพื้นที่เก็บข้อมูลและปรับปรุงประสิทธิภาพได้

ดัชนีแบบหลายคีย์สำหรับค่าอาร์เรย์

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

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

สถานการณ์ต่อไปนี้จะทำให้เกิดข้อผิดพลาดเมื่อทำงานกับค่าอาร์เรย์และดัชนีแบบหลายคีย์

  • การดำเนินการพยายามเพิ่มค่าอาร์เรย์ลงในช่องที่จัดทำดัชนีโดยดัชนีปกติ หากต้องการเพิ่มค่าอาร์เรย์ คุณต้องลบดัชนีปกติที่มีอยู่ในฟิลด์นั้น แล้วสร้างใหม่เป็นดัชนีแบบหลายคีย์
  • คุณพยายามสร้างดัชนีปกติในฟิลด์ที่มีค่าอาร์เรย์ คุณต้องสร้างดัชนีแบบหลายคีย์หรือลบค่าอาร์เรย์
  • การดำเนินการพยายามจัดทำดัชนีหลายช่องด้วยค่าอาร์เรย์ คุณไม่สามารถมีช่องมากกว่า 1 ช่องที่มีค่าอาร์เรย์ในดัชนีแบบหลายคีย์ หากต้องการดำเนินการต่อ ให้แก้ไขโมเดลข้อมูลหรือคำจำกัดความของดัชนี
  • คุณพยายามสร้างดัชนีแบบหลายคีย์ที่เส้นทางฟิลด์ 2 เส้นทางใช้คำนำหน้าร่วมกัน เช่น users.posts และ users.zip

ดัชนีที่ไม่ซ้ำกัน

ตั้งค่าตัวเลือกดัชนีที่ไม่ซ้ำกันเพื่อบังคับใช้ค่าที่ไม่ซ้ำกันสำหรับช่องที่จัดทำดัชนี สำหรับดัชนีในหลายฟิลด์ ชุดค่าผสมแต่ละชุดต้องไม่ซ้ำกันในดัชนี ฐานข้อมูลจะปฏิเสธการดำเนินการอัปเดตและแทรกที่พยายามสร้างรายการดัชนีที่มีค่าซ้ำกัน หากข้อมูลของช่องที่จัดทำดัชนีมีค่าที่ซ้ำกันและคุณพยายามสร้างดัชนีที่ไม่ซ้ำกัน การสร้างดัชนีจะล้มเหลวพร้อมข้อความแสดงข้อผิดพลาดในรายละเอียดการดำเนินการ

ไม่มีช่องในดัชนีที่ไม่ซ้ำกัน

หากคุณแทรกเอกสารที่ไม่มีช่องสำหรับดัชนีที่ไม่ซ้ำกัน ดัชนีจะตั้งค่า null สำหรับช่องที่ขาดหายไป รายการดัชนีที่ได้ต้องไม่ซ้ำกัน มิฉะนั้นการดำเนินการจะล้มเหลว

ตัวอย่างเช่น ดัชนีต่อไปนี้

db.cities.createIndex( { "name": 1 }, { unique: true } )

หากคุณเพิ่มเอกสาร {"abbreviation": "LA"} ลงในคอลเล็กชัน ดัชนีที่ไม่ซ้ำกันจะสร้างรายการที่มี name ตั้งค่าเป็น null หากคุณพยายามเพิ่มเอกสาร {"abbreviation": "NYC"} การดำเนินการจะล้มเหลวเนื่องจากรายการที่ได้สำหรับดัชนีที่ไม่ซ้ำกันนั้นเหมือนกัน

ลักษณะการทำงานเดียวกันนี้ใช้กับดัชนีที่ไม่ซ้ำกันซึ่งมีหลายช่อง เมื่อสร้างหรืออัปเดตเอกสาร ระบบจะตั้งค่าช่องที่จัดทำดัชนีที่ขาดหายไปเป็น null และรายการดัชนีที่ได้จะต้องไม่ซ้ำกันในดัชนี

ดัชนีที่ไม่ซ้ำกันในค่าอาร์เรย์

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

ดัชนีประเภทนี้ไม่บังคับให้อาร์เรย์มีค่าที่ไม่ซ้ำกันภายในเอกสารเดียว

เช่น ด้วยดัชนีที่ไม่ซ้ำกัน

db.collection.createIndex( { "tags": 1 }, { unique: true } )

เอกสารต่อไปนี้ถูกต้องและแทรกได้

{
  "_id": 1,
  "tags": [ "news", "tech", "news", "music" ]
}

ดัชนีอนุญาตให้มีค่าซ้ำกัน ("news") ภายในอาร์เรย์เดียวกันของเอกสารเดียว

หากคุณพยายามแทรกเอกสารที่ 2 ที่มีองค์ประกอบซ้ำกัน การดำเนินการจะล้มเหลว

{
  "_id": 2,
  "tags": [ "sports", "music" ]
}

การดำเนินการล้มเหลวเนื่องจาก "music" มีอยู่ในอาร์เรย์ของเอกสาร 1 และแมปในดัชนีแล้ว

หากต้องการตรวจสอบว่าองค์ประกอบภายในอาร์เรย์เดียวกันในเอกสารเดียวไม่ซ้ำกัน ให้จัดการปัญหานี้ในตรรกะของแอปพลิเคชันโดยใช้โอเปอเรเตอร์การอัปเดต เช่น $addToSet แทน $push

อาร์เรย์ว่างเปล่า ช่องที่ขาดหายไป และค่า Null

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

  • อาร์เรย์ว่างเปล่า ช่องที่ขาดหายไป และค่า Null แบบสแตนด์อโลน: หากช่องอาร์เรย์ว่างเปล่า ขาดหายไปทั้งหมด หรือมีค่า null แบบสแตนด์อโลน (ไม่ได้อยู่ภายในอาร์เรย์) ระบบจะไม่สร้างคีย์ดัชนีสำหรับเอกสาร ดังนั้น เอกสารหลายรายการจึงมีช่องว่างเปล่าหรือค่า null แบบสแตนด์อโลนได้โดยไม่ทำให้เกิดข้อผิดพลาดคีย์ซ้ำกัน
  • องค์ประกอบ Null ภายในอาร์เรย์: หากอาร์เรย์มีค่า null เป็นองค์ประกอบ (เช่น ["news", null]) ระบบจะจัดทำดัชนีองค์ประกอบ null เอกสารต่อๆ มาที่มีองค์ประกอบ null ในช่องอาร์เรย์ที่จัดทำดัชนีจะดำเนินการไม่สำเร็จเนื่องจากมีข้อผิดพลาดคีย์ซ้ำ

ดัชนี TTL

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

แก้ปัญหาข้อผิดพลาดในการสร้างดัชนี

คุณอาจพบข้อผิดพลาดในการสร้างดัชนีเมื่อจัดการดัชนี การดำเนินการจัดทำดัชนีอาจล้มเหลวหากฐานข้อมูลพบปัญหาเกี่ยวกับข้อมูล การดำเนินการจัดทำดัชนีอาจไม่สำเร็จเนื่องจากสาเหตุต่อไปนี้

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

ขั้นตอนถัดไป