หน้านี้อธิบายการจัดทำดัชนีสำหรับ 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 และรายการค่าดัชนีที่ได้ต้องไม่ซ้ำกันในดัชนี
ดัชนีที่ไม่ซ้ำกันในค่าอาร์เรย์
คุณสามารถใช้ดัชนี Multikey ที่ไม่ซ้ำกันเพื่อบังคับให้เอกสารไม่มีองค์ประกอบอาร์เรย์ที่ทับซ้อนกัน
ดัชนีประเภทนี้ไม่บังคับให้อาร์เรย์มีค่าที่ไม่ซ้ำกันภายในเอกสารเดียว
เช่น ด้วยดัชนีที่ไม่ซ้ำกัน
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 ช่องที่มีค่าอาร์เรย์ในดัชนีแบบหลายคีย์ หากต้องการดำเนินการต่อ ให้แก้ไขโมเดลข้อมูลหรือคำจำกัดความของดัชนี
- คุณตั้งค่าตัวเลือกดัชนีที่ไม่ซ้ำกันและข้อมูลของช่องที่จัดทำดัชนีจะสร้างรายการค่าดัชนีที่ซ้ำกัน หากต้องการดำเนินการต่อ ให้นำชุดค่าผสมที่ซ้ำกันออกจากข้อมูล
ขั้นตอนถัดไป
- ดูวิธีสร้างและจัดการดัชนีหรือดัชนี TTL