בדף הזה מתוארת ההוספה לאינדקס ב-Cloud Firestore. Cloud Firestore לא יוצר אינדקסים כברירת מחדל. כדי לשפר את ביצועי מסד הנתונים, צרו אינדקסים לשאילתות הנפוצות ביותר.
לאינדקסים יש השפעה גדולה על הביצועים של מסד נתונים. אם קיים אינדקס לשאילתה, מסד הנתונים יכול להחזיר תוצאות ביעילות על ידי צמצום כמות הנתונים שצריך לסרוק וצמצום העבודה הדרושה למיון התוצאות. עם זאת, רשומות באינדקס מגדילות את עלויות האחסון ואת כמות העבודה שמתבצעת במהלך פעולת כתיבה בשדות שנוסף להם אינדקס.
הגדרה ומבנה של אינדקס
אינדקס מורכב מהרכיבים הבאים:
- מזהה אוסף
- רשימת שדות באוסף הנתון
- סדר, עולה או יורד, לכל שדה
אינדקס יכול גם להפעיל את האפשרויות sparse, multikey או unique.
סדר האינדקס
הסדר וכיוון המיון של כל שדה מגדירים את האינדקס באופן ייחודי. לדוגמה, שני האינדקסים הבאים הם אינדקסים נפרדים ואי אפשר להחליף ביניהם:
| איסוף | שדות |
|---|---|
| ערים | מדינה (בסדר עולה), אוכלוסייה (בסדר יורד) |
| ערים | אוכלוסייה (בסדר יורד), מדינה (בסדר עולה), |
כשיוצרים אינדקס כדי לתמוך בשאילתה, צריך לכלול את השדות באותו סדר כמו בשאילתה.
צפיפות האינדקס
כברירת מחדל, רשומות האינדקס מאחסנות נתונים מכל המסמכים באוסף. אינדקס כזה נקרא אינדקס לא דליל. רשומה תתווסף לאינדקס של מסמך גם אם המסמך לא מכיל אף אחד מהשדות שצוינו באינדקס. שדות שלא קיימים נחשבים כבעלי ערך NULL כשנוצרים רשומות באינדקס. כדי לשנות את ההתנהגות הזו, אפשר להגדיר את האינדקס כאינדקס דליל.
אינדקסים דלילים
אינדקס דליל מוסיף לאינדקס רק את המסמכים באוסף שמכילים ערך (כולל null) בשדה אחד לפחות מהשדות שנוספו לאינדקס. אינדקס דליל מפחית את עלויות האחסון ויכול לשפר את הביצועים.
אינדקסים עם כמה מפתחות לערכי מערך
אם אתם יוצרים אינדקס בשדה שמכיל ערכי מערך, אתם צריכים ליצור אינדקס עם כמה מפתחות. אינדקס רגיל לא יכול להוסיף לאינדקס ערכים של מערך. אינדקס עם כמה מפתחות תומך בשדה מערך אחד לכל היותר בהגדרת האינדקס, ואפשר להשתמש בו לפעולות שעוברות על ערכי המערך.
השתמשו באינדקסים עם כמה מפתחות רק אם אתם יודעים שאתם צריכים להוסיף לאינדקס ערכי מערך. לאינדקסים רגילים יש יתרונות כשמעבדים שאילתה. לדוגמה, אינדקסים רגילים יכולים לסנן ערכים בטווח מסוים בצורה יעילה יותר.
המצבים הבאים מובילים לשגיאות כשעובדים עם ערכי מערכים ואינדקסים עם כמה מפתחות:
- פעולה מנסה להוסיף ערך מערך לשדה שנוסף לאינדקס באמצעות אינדקס רגיל. כדי להוסיף את ערך המערך, צריך למחוק את האינדקסים הרגילים הקיימים בשדה הזה וליצור אותם מחדש כאינדקסים עם כמה מפתחות.
- אתם מנסים ליצור אינדקס רגיל בשדה שמכיל ערך מערך. צריך ליצור אינדקס עם כמה מפתחות או למחוק את ערכי המערך.
- פעולה מנסה להוסיף לאינדקס כמה שדות עם ערכי מערך. באינדקס עם כמה מפתחות, אי אפשר להגדיר יותר משדה אחד עם ערך מערך. כדי להמשיך, צריך לשנות את מודל הנתונים או את הגדרות האינדקס.
- אתם מנסים ליצור אינדקס עם כמה מפתחות שבו לשני נתיבי שדות יש קידומת משותפת, כמו
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") באותו מערך של מסמך יחיד.
אם תנסו להוסיף מסמך שני עם רכיב כפול, הפעולה תיכשל:
{
"_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 שעות אחרי מועד התפוגה שלהם.
פתרון שגיאות בבניית אינדקסים
יכול להיות שתיתקלו בשגיאות בבניית אינדקסים בזמן ניהול האינדקסים. פעולת הוספה לאינדקס יכולה להיכשל אם יש בעיה בנתונים במסד הנתונים. פעולות הוספה לאינדקס יכולות להיכשל מהסיבות הבאות:
- הגעת למגבלת האינדקס. לדוגמה, יכול להיות שהפעולה הגיעה למספר המקסימלי של רשומות אינדקס לכל מסמך. אם יצירת האינדקס נכשלת, תופיע הודעת שגיאה. אם לא הגעתם למגבלת האינדקס, נסו שוב את פעולת האינדקס.
- נדרש אינדקס עם כמה מפתחות. לפחות אחד מהשדות שנוספו לאינדקס מכיל ערך מערך. כדי להמשיך, צריך להשתמש באינדקס עם כמה מפתחות או למחוק את ערכי המערך.
- פעולה מנסה להוסיף לאינדקס כמה שדות עם ערכי מערך. באינדקס עם כמה מפתחות, אי אפשר להגדיר יותר משדה אחד עם ערך של מערך. כדי להמשיך, צריך לשנות את מודל הנתונים או את הגדרות האינדקס.
- הגדרתם את האפשרות של אינדקס ייחודי, והנתונים של השדות שנוסף להם אינדקס ייצרו רשומות אינדקס כפולות. כדי להמשיך, צריך להסיר מהנתונים שילובים כפולים של ערכים.