בדף הזה מתואר תהליך ההוספה לאינדקס של Cloud Firestore. ב-Cloud Firestore לא נוצרים אינדקסים כברירת מחדל. כדי לשפר את הביצועים של מסד הנתונים, כדאי ליצור אינדקסים לשאילתות הנפוצות ביותר.
לאינדקסים יש השפעה רבה על הביצועים של מסד נתונים. אם קיים אינדקס לשאילתה, מסד הנתונים יכול להחזיר תוצאות ביעילות על ידי צמצום כמות הנתונים שצריך לסרוק וצמצום העבודה שנדרשת למיון התוצאות. עם זאת, רשומות אינדקס מגדילות את עלויות האחסון ואת כמות העבודה שמתבצעת במהלך פעולת כתיבה בשדות שנוספו לאינדקס.
הגדרה ומבנה של אינדקס
אינדקס מורכב מהרכיבים הבאים:
- מזהה אוסף
- רשימה של שדות באוסף הנתון
- סדר, עולה או יורד, לכל שדה
אינדקס יכול גם להפעיל את האפשרויות sparse, multikey או unique.
סדר האינדקס
הסדר וכיוון המיון של כל שדה מגדירים באופן ייחודי את האינדקס. לדוגמה, המדדים הבאים הם שני מדדים שונים ולא ניתנים להחלפה:
| איסוף | שדות |
|---|---|
| ערים | country (ascending), population (descending) |
| ערים | אוכלוסייה (יורד), מדינה (עולה), |
כשיוצרים אינדקס לתמיכה בשאילתה, צריך לכלול את השדות באותו סדר כמו בשאילתה.
צפיפות האינדקס
כברירת מחדל, רשומות האינדקס מאחסנות נתונים מכל המסמכים באוסף. זה נקרא אינדקס לא דליל. ערך באינדקס יתווסף למסמך גם אם המסמך לא מכיל אף אחד מהשדות שצוינו באינדקס. כשיוצרים רשומות אינדקס, המערכת מתייחסת לשדות שלא קיימים כאילו יש להם ערך NULL. כדי לשנות את ההתנהגות הזו, אפשר להגדיר את האינדקס כאינדקס דליל.
אינדקסים דלילים
אינדקס דליל מאנדקס רק את המסמכים באוסף שמכילים ערך (כולל null) לפחות לאחד מהשדות המאונדקסים. אינדקס דליל מפחית את עלויות האחסון ויכול לשפר את הביצועים.
אינדקסים עם כמה מפתחות לערכי מערך
אם יוצרים אינדקס בשדה שמכיל ערכי מערך, צריך ליצור אינדקס מרובה מפתחות. אינדקס רגיל לא יכול להצביע על ערכי מערך. אינדקס עם כמה מפתחות תומך בשדה מערך אחד בהגדרת האינדקס, ואפשר להשתמש בו לפעולות שסורקות ערכי מערך.
משתמשים באינדקסים עם כמה מפתחות רק אם יודעים שצריך ליצור אינדקס לערכי מערך. לאינדקסים רגילים יש יתרונות כשמעבדים שאילתה. לדוגמה, אינדקסים רגילים יכולים לסנן ערכים בטווח בצורה יעילה יותר.
המצבים הבאים מובילים לשגיאות כשעובדים עם ערכי מערך ועם אינדקסים עם כמה מפתחות:
- פעולה מנסה להוסיף ערך של מערך לשדה שמסודר באינדקס לפי אינדקס רגיל. כדי להוסיף את ערך המערך, צריך למחוק את האינדקסים הרגילים הקיימים בשדה הזה וליצור אותם מחדש כאינדקסים מרובי-מפתחות.
- אתם מנסים ליצור אינדקס רגיל בשדה שמכיל ערך של מערך. צריך ליצור אינדקס עם כמה מפתחות או למחוק את ערכי המערך.
- פעולה מנסה ליצור אינדקס של כמה שדות עם ערכי מערך. באינדקס עם כמה מפתחות לא יכול להיות יותר משדה אחד עם ערך מערך. כדי להמשיך, צריך לשנות את מודל הנתונים או את הגדרות האינדקס.
- אתם מנסים ליצור אינדקס עם כמה מפתחות שבו לשתי נתיבי שדות יש קידומת משותפת, כמו
users.postsו-users.zip.
מדדים ייחודיים
מגדירים את האפשרות של אינדקס ייחודי כדי לאכוף ערכים ייחודיים בשדות המאונדקסים. באינדקסים של כמה שדות, כל שילוב של ערכים חייב להיות ייחודי באינדקס. מסד הנתונים דוחה כל פעולת עדכון והוספה שמנסה ליצור רשומות אינדקס עם ערכים כפולים. אם הנתונים של השדות המאונדקסים מכילים ערכים כפולים ואתם מנסים ליצור אינדקס ייחודי, בניית האינדקס נכשלת ומוצגת הודעת שגיאה בפרטי הפעולה.
שדות חסרים באינדקס ייחודי
אם מוסיפים מסמך עם שדות חסרים לאינדקס הייחודי, המערכת מגדירה ערכים של null לשדות החסרים. רשומת האינדקס שמתקבלת חייבת להיות ייחודית, אחרת הפעולה תיכשל.
לדוגמה, עם האינדקס הזה:
db.cities.createIndex( { "name": 1 }, { unique: true } )
אם מוסיפים את המסמך {"abbreviation": "LA"} לאוסף, האינדקס הייחודי יוצר רשומה עם name שמוגדר כ-null. אם תנסו להוסיף את המסמך {"abbreviation": "NYC"}, הפעולה תיכשל כי הרשומה שמתקבלת לאינדקס הייחודי זהה.
אותו התנהגות חלה על אינדקסים ייחודיים עם כמה שדות.
כשיוצרים או מעדכנים מסמך, שדות חסרים באינדקס מוגדרים ל-null והערך שמתקבל באינדקס חייב להיות ייחודי באינדקס.
אינדקסים של TTL
אפשר להשתמש באינדקסים של TTL כדי להסיר באופן אוטומטי נתונים לא עדכניים ממסדי הנתונים. אינדקס TTL מציין שדה מסוים כזמן התפוגה של מסמכים באוסף נתון. באמצעות TTL, אפשר להקטין את עלויות האחסון על ידי ניקוי נתונים לא רלוונטיים. בדרך כלל הנתונים נמחקים תוך 24 שעות לאחר זמן התפוגה שלהם.
פתרון בעיות שקשורות ליצירת אינדקס
יכול להיות שתיתקלו בשגיאות בבניית האינדקסים כשאתם מנהלים את האינדקסים. פעולת יצירת אינדקס עלולה להיכשל אם יש בעיה בנתונים במסד הנתונים. פעולות יצירת אינדקס עשויות להיכשל מהסיבות הבאות:
- הגעתם למגבלת אינדקס. לדוגמה, יכול להיות שהפעולה הגיעה למספר המקסימלי של רשומות אינדקס לכל מסמך. אם יצירת האינדקס נכשלת, מוצגת הודעת שגיאה. אם לא הגעתם למגבלת אינדקס, נסו שוב לבצע את פעולת האינדקס.
- נדרש אינדקס עם כמה מפתחות. לפחות אחד מהשדות שעברו אינדוקס מכיל ערך של מערך. כדי להמשיך, צריך להשתמש באינדקס עם כמה מפתחות או למחוק את ערכי המערך.
- פעולה מנסה ליצור אינדקס של כמה שדות עם ערכי מערך. באינדקס עם כמה מפתחות לא יכול להיות יותר משדה אחד עם ערך מערך. כדי להמשיך, צריך לשנות את מודל הנתונים או את הגדרות האינדקס.
- מגדירים את האפשרות של אינדקס ייחודי, והנתונים של השדות המאונדקסים ייצרו רשומות אינדקס כפולות. כדי להמשיך, צריך להסיר מהנתונים שילובים כפולים של ערכים.