ส่วนนี้จะอธิบายการจัดทำดัชนีสำหรับ 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 |
|---|---|---|
{ |
จัดทำดัชนีแล้ว: • (แท็ก: "news", สถานะ: "active") |
จัดทำดัชนีแล้ว: • (แท็ก: "news", สถานะ: "active") |
{ |
จัดทำดัชนีแล้ว: • (แท็ก: "news", สถานะ: "active") • (แท็ก: "sports", สถานะ: "active") |
จัดทำดัชนีแล้ว: • (แท็ก: "news", สถานะ: "active") • (แท็ก: "sports", สถานะ: "active") |
{ |
จัดทำดัชนีแล้ว: • (แท็ก: "news", สถานะ: "active") (กรองข้อมูลที่ซ้ำกันออกแล้ว) |
จัดทำดัชนีแล้ว: • (แท็ก: "news", สถานะ: "active") (กรองข้อมูลที่ซ้ำกันออกแล้ว) |
{ |
จัดทำดัชนีแล้ว: • (แท็ก: null, สถานะ: "active") |
จัดทำดัชนีแล้ว: • (แท็ก: null, สถานะ: "active") |
{ |
จัดทำดัชนีแล้ว: • (แท็ก: "news", สถานะ: null) |
ไม่ได้จัดทำดัชนี (ไม่มีช่อง status) |
{ |
ไม่ได้จัดทำดัชนี (ช่องไม่ใช่ Array) | ไม่ได้จัดทำดัชนี (ช่องไม่ใช่ Array) |
{ |
ไม่ได้จัดทำดัชนี (ช่องไม่ใช่ Array) | ไม่ได้จัดทำดัชนี (ฟิลด์ไม่ใช่อาร์เรย์) |
{ |
ไม่ได้จัดทำดัชนี (ไม่มีช่อง tags) |
ไม่ได้จัดทำดัชนี (ไม่มีฟิลด์ tags) |
{ |
ไม่ได้จัดทำดัชนี (อาร์เรย์ว่างเปล่า) | ไม่ได้จัดทำดัชนี (อาร์เรย์ว่างเปล่า) |
ตัวอย่างการค้นหา
เว็บ
// 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ในช่องอาร์เรย์ที่จัดทำดัชนีจะดำเนินการไม่สำเร็จเนื่องจากมีข้อผิดพลาดคีย์ซ้ำ
แก้ปัญหาข้อผิดพลาดในการสร้างดัชนี
คุณอาจพบข้อผิดพลาดในการสร้างดัชนีเมื่อจัดการดัชนี การดำเนินการจัดทำดัชนีอาจล้มเหลวหากฐานข้อมูลพบปัญหาเกี่ยวกับข้อมูล การดำเนินการจัดทำดัชนีอาจไม่สำเร็จเนื่องจากสาเหตุต่อไปนี้
- คุณมีดัชนีถึงขีดจำกัดแล้ว เช่น การดำเนินการอาจถึงจำนวนรายการดัชนีสูงสุดต่อเอกสารแล้ว หากสร้างดัชนีไม่สำเร็จ คุณจะเห็นข้อความแสดงข้อผิดพลาด หากยังไม่ถึงขีดจำกัดของดัชนี ให้ลองดำเนินการจัดทำดัชนีอีกครั้ง
- คุณตั้งค่าตัวเลือกดัชนีที่ไม่ซ้ำกัน และข้อมูลของช่องที่จัดทำดัชนีจะสร้างรายการดัชนีที่ซ้ำกัน หากต้องการดำเนินการต่อ ให้นำชุดค่าผสมที่ซ้ำกันออกจากข้อมูล
ขั้นตอนถัดไป
ดูวิธีสร้างและจัดการดัชนี