סקירה כללית של אינדקס מהדורות Enterprise

התנהגות האינדקס תלויה במהדורה של מסד הנתונים. בדף הזה מתוארת הוספת אינדקסים במהדורת Firestore Enterprise. למידע על מהדורת Standard של Firestore, אפשר לעיין במאמר סקירה כללית של אינדקסים במהדורת Standard של Firestore.

בקטע הזה מתואר תהליך יצירת האינדקס במהדורת Firestore Enterprise. כברירת מחדל, מהדורת Firestore Enterprise לא יוצרת אינדקסים. כדי להפחית עלויות ולשפר את הביצועים של מסד הנתונים, כדאי ליצור אינדקסים לשאילתות הנפוצות ביותר.

לאינדקסים יש השפעה גדולה על הביצועים של מסד נתונים. אם קיים אינדקס לשאילתה, מסד הנתונים יכול להחזיר תוצאות ביעילות על ידי צמצום כמות הנתונים שצריך לסרוק וצמצום העבודה שנדרשת למיון התוצאות. עם זאת, רשומות באינדקס מגדילות את עלויות האחסון ואת כמות העבודה שמתבצעת במהלך פעולת כתיבה בשדות שנוסף להם אינדקס.

הגדרה ומבנה של אינדקס

אינדקס מורכב מהרכיבים הבאים:

  • מזהה אוסף
  • רשימת שדות באוסף הנתון
  • מצב אינדקס, בסדר עולה, בסדר יורד או array-contains, לכל שדה

אינדקס יכול גם להפעיל את האפשרויות sparse או unique.

סדר האינדקס

הסדר וכיוון המיון של כל שדה מגדירים באופן ייחודי את האינדקס. לדוגמה, שני האינדקסים הבאים הם אינדקסים נפרדים ואי אפשר להחליף ביניהם:

אוסף שדות
ערים מדינה (בסדר עולה), אוכלוסייה (בסדר יורד)
ערים אוכלוסייה (בסדר יורד), מדינה (בסדר עולה),

כשיוצרים אינדקס לתמיכה בשאילתה, צריך לכלול את השדות באותו סדר כמו בשאילתה.

צפיפות האינדקס

כברירת מחדל, רשומות האינדקס מאחסנות נתונים מכל המסמכים באוסף. זה נקרא אינדקס לא דליל. רשומה באינדקס תתווסף למסמך גם אם המסמך לא מכיל אף אחד מהשדות שצוינו באינדקס. שדות שלא קיימים נחשבים כבעלי ערך NULL כשנוצרים רשומות באינדקס. כדי לשנות את ההתנהגות הזו, אפשר להגדיר את האינדקס כאינדקס דליל.

אינדקסים דלילים

אינדקס דליל מאנדקס רק את המסמכים באוסף שמכילים ערך (כולל null) לפחות לאחד מהשדות המאונדקסים. אינדקס דליל מפחית את עלויות האחסון ויכול לשפר את הביצועים.

אינדקסים של array-contains

כדי לשפר את ביצועי השאילתות כששולחים שאילתה לשדה מערך באמצעות array-contains או array-contains-any, אפשר להוסיף את השדה לאינדקס במצב array-contains. באינדקס יכול להיות שדה אחד לכל היותר במצב array-contains.

באמצעות יצירת אינדקס לשדה מערך במצב array-contains, מנוע השאילתות יכול לאתר במהירות מסמכים שמכילים ערכים ספציפיים במערך. בלי אינדקס, השאילתות בודקות את ערכי המערך על ידי ביצוע סריקה מלאה של האוסף, מה שמגדיל את זמן האחזור של השאילתות ואת עלויות הקריאה ככל שהגודל של האוסף גדל.

כדי ליצור אינדקס לשדה מערך, השדה צריך לעמוד בדרישה הבאה:

  • דרישה למערך לא ריק: רשומה באינדקס נוצרת רק אם שדה המערך קיים במסמך והוא מערך לא ריק. מסמכים עם שדות חסרים, שדות שאינם מערך או מערכים ריקים לא נכללים באינדקס.

מה הקשר בין הצפיפות לבין אינדקסים של array-contains

באינדקסים שכוללים שדה array-contains, כללי צפיפות האינדקס חלים רק על השדות המסודרים באינדקס. אם הדרישה למערך לא ריק מתקיימת, כללי הצפיפות חלים על שדות אינדקסים מסודרים שנותרו באינדקס:

  • אינדקס לא דליל (DENSE): נוצרת רשומת אינדקס למסמך. שדות ממוינים לאינדקס שחסרים באינדקס נשמרים כ-null ברשומת האינדקס.
  • אינדקס דליל (SPARSE): רשומה באינדקס נוצרת רק אם לפחות אחד מהשדות הממוינים באינדקס קיים במסמך.

דוגמה: יצירת רשומה באינדקס

כדאי לשים לב למדד 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"
}
לא נוסף לאינדקס (השדה לא מערך) לא נוסף לאינדקס (השדה לא מערך)
{
  tags: null,
  status: "active"
}
לא נוסף לאינדקס (השדה לא מערך) לא נוסף לאינדקס (השדה הוא לא מערך)
{
  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") באותו מערך של מסמך יחיד.

אם תנסו להוסיף מסמך שני, doc2, עם רכיב כפול, הפעולה תיכשל:

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

הפעולה נכשלת כי "music" כבר קיים במערך של doc1 וממופה באינדקס.

אם אתם צריכים לוודא שהרכיבים באותו מערך במסמך אחד הם ייחודיים, טפלו בזה בלוגיקה של האפליקציה.

מערכים ריקים, שדות חסרים וערכי null

בדרך כלל, שדות חסרים באינדקס ייחודי נחשבים כ-null וחייבים להיות ייחודיים בכל המסמכים (ראו שדות חסרים באינדקס ייחודי). עם זאת, לגבי אינדקסים ייחודיים בשדות מערך:

  • מערכים ריקים, שדות חסרים וערכי null עצמאיים: אם שדה המערך ריק, חסר לחלוטין או מכיל ערך null עצמאי (לא בתוך מערך), לא נוצרים מפתחות אינדקס למסמך. לכן, למספר מסמכים יכולים להיות שדות ריקים או ערכי null נפרדים בלי להפעיל שגיאות של מפתחות כפולים.
  • רכיבי Null בתוך מערך: אם המערך מכיל ערך null כרכיב (לדוגמה, ["news", null]), רכיב null מקבל אינדקס. כל מסמך נוסף שמכיל רכיב null בשדה המערך שנוסף לו אינדקס ייכשל עם שגיאת מפתח כפול.

פתרון בעיות שקשורות ליצירת אינדקס

יכול להיות שתיתקלו בשגיאות בבניית האינדקסים כשאתם מנהלים את האינדקסים. פעולת הוספה לאינדקס יכולה להיכשל אם יש בעיה בנתונים במסד הנתונים. פעולות הוספה לאינדקס יכולות להיכשל מהסיבות הבאות:

  • הגעתם למגבלת האינדקס. לדוגמה, יכול להיות שהפעולה הגיעה למספר המקסימלי של רשומות אינדקס לכל מסמך. אם יצירת האינדקס נכשלת, תופיע הודעת שגיאה. אם לא הגעתם למגבלת אינדקס, נסו שוב את פעולת האינדקס.
  • הגדרתם את האפשרות של אינדקס ייחודי והנתונים של השדות באינדקס ייצרו רשומות כפולות באינדקס. כדי להמשיך, צריך להסיר מהנתונים שילובים כפולים של ערכים.