ภาพรวมดัชนี

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ดัชนี Array-contains

หากต้องการเพิ่มประสิทธิภาพการค้นหาเมื่อค้นหาช่องอาร์เรย์โดยใช้ array-contains หรือ array-contains-any คุณสามารถจัดทำดัชนีช่องในโหมด array-contains ได้ ดัชนีมีช่องในโหมด array-contains ได้สูงสุด 1 ช่อง

การจัดทำดัชนีช่องอาร์เรย์ในโหมด array-contains ช่วยให้เครื่องมือค้นหาค้นหาเอกสารที่มีค่าอาร์เรย์ที่เฉพาะเจาะจงได้อย่างรวดเร็ว หากไม่มีดัชนี การค้นหาจะตรวจสอบค่าอาร์เรย์โดยทำการสแกนคอลเล็กชันทั้งหมด ซึ่งจะเพิ่มเวลาในการตอบสนองของการค้นหาและค่าใช้จ่ายในการอ่านเมื่อขนาดของคอลเล็กชันเพิ่มขึ้น

หากต้องการจัดทำดัชนีช่องอาร์เรย์ ช่องดังกล่าวต้องเป็นไปตามข้อกำหนดต่อไปนี้

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

ความหนาแน่นเกี่ยวข้องกับดัชนี array-contains อย่างไร

สำหรับดัชนีที่มีช่อง array-contains กฎความหนาแน่นของดัชนีจะมีผลกับช่องที่จัดทำดัชนีตามลำดับเท่านั้น หากเป็นไปตามข้อกำหนดอาร์เรย์ที่ไม่ว่างเปล่า กฎความหนาแน่นจะมีผลกับช่องที่จัดทำดัชนีตามลำดับที่เหลือในดัชนี

  • ดัชนีแบบไม่กระจัดกระจาย (DENSE): ระบบจะสร้างรายการดัชนีสำหรับเอกสาร ระบบจะจัดเก็บช่องที่จัดทำดัชนีตามลำดับที่ขาดหายไปในดัชนีเป็น null ในรายการดัชนี
  • ดัชนีแบบ Sparse (SPARSE): ระบบจะสร้างรายการดัชนีก็ต่อเมื่อมีช่องที่จัดทำดัชนีตามลำดับอย่างน้อย 1 ช่องในเอกสาร

ตัวอย่าง: การสร้างรายการดัชนี

พิจารณาดัชนี users (tags[*], status ASC):

เอกสาร ดัชนี NON-SPARSE ดัชนี SPARSE
{
  tags: ["news"],
  status: "active"
}
จัดทำดัชนีแล้ว:
• (แท็ก: "news", สถานะ: "active")
จัดทำดัชนีแล้ว:
• (แท็ก: "news", สถานะ: "active")
{
  tags: ["news", "sports"],
  status: "active"
}
จัดทำดัชนีแล้ว:
• (แท็ก: "news", สถานะ: "active")
• (แท็ก: "sports", สถานะ: "active")
จัดทำดัชนีแล้ว:
• (แท็ก: "news", สถานะ: "active")
• (แท็ก: "sports", สถานะ: "active")
{
  tags: ["news", "news"],
  status: "active"
}
จัดทำดัชนีแล้ว:
• (แท็ก: "news", สถานะ: "active") (กรองข้อมูลที่ซ้ำกันออกแล้ว)
จัดทำดัชนีแล้ว:
• (แท็ก: "news", สถานะ: "active") (กรองข้อมูลที่ซ้ำกันออกแล้ว)
{
  tags: [null],
  status: "active"
}
จัดทำดัชนีแล้ว:
• (แท็ก: null, สถานะ: "active")
จัดทำดัชนีแล้ว:
• (แท็ก: null, สถานะ: "active")
{
  tags: ["news"]
}
จัดทำดัชนีแล้ว:
• (แท็ก: "news", สถานะ: null)
ไม่ได้จัดทำดัชนี (ไม่มีช่อง status)
{
  tags: "news",
  status: "active"
}
ไม่ได้จัดทำดัชนี (ช่องไม่ใช่ Array) ไม่ได้จัดทำดัชนี (ช่องไม่ใช่ Array)
{
  tags: null,
  status: "active"
}
ไม่ได้จัดทำดัชนี (ช่องไม่ใช่ Array) ไม่ได้จัดทำดัชนี (ฟิลด์ไม่ใช่อาร์เรย์)
{
  status: "active"
}
ไม่ได้จัดทำดัชนี (ไม่มีช่อง tags) ไม่ได้จัดทำดัชนี (ไม่มีฟิลด์ tags)
{
  tags: [],
  status: "active"
}
ไม่ได้จัดทำดัชนี (อาร์เรย์ว่างเปล่า) ไม่ได้จัดทำดัชนี (อาร์เรย์ว่างเปล่า)

ตัวอย่างการค้นหา

เว็บ
// Query for users where 'tags' contains 'news' and 'status' is 'active'
const query = db.collection("users")
  .where("tags", "array-contains", "news")
  .where("status", "==", "active");

// Documents returned by the query:
// [
//   {
//     "id": "alice",
//     "tags": ["news", "tech"],
//     "status": "active"
//   }
// ]

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

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

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

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

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

การรวบรวม ช่องที่จัดทำดัชนี ขอบเขตการค้นหา
เมือง ชื่อ (จากน้อยไปมาก) การรวบรวม

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

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

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

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

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

ตัวอย่างเช่น หากมีดัชนีที่ไม่ซ้ำกันในช่องชื่อ tags ให้ทำดังนี้

เอกสาร doc1 ต่อไปนี้ถูกต้องสำหรับการแทรก

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

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

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

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

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

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

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

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

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

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

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

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

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

ดูวิธีสร้างและจัดการดัชนี