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