כדי לפתור בעיות של שאילתות איטיות, אפשר להשתמש בהסבר על שאילתות כדי לקבל את תוכנית ההרצה של השאילתה ואת פרופיל ההרצה בזמן הריצה. בקטע הבא מתוארים השלבים שאפשר לבצע כדי לשפר את ביצועי השאילתות, בהתאם לפרופיל הביצוע:
להגביל את מספר התוצאות
כדי לזהות אם השאילתה מחזירה הרבה מסמכים, השתמשו בשדה records returned בעץ הביצוע. כדאי להגביל את מספר המסמכים שמוחזרים באמצעות הסעיף $limit. כך אפשר לצמצם את גודל הבייטים של התוצאות בסדרה כשהן מוחזרות ללקוחות דרך הרשת. במקרים שבהם לפני הצומת Limit יש צומת MajorSort, מנוע השאילתות יכול לאחד את הצמתים Limit ו-MajorSort ולהחליף את מיון ה-materialization המלא בזיכרון במיון TopN, וכך להפחית את דרישות הזיכרון של השאילתה.
הגבלת גודל המסמך של התוצאה
כדי להימנע מאחזור של שדות מיותרים, כדאי להגביל את גודל המסמך שמוחזר באמצעות הסעיף $project. כך אפשר לצמצם את עלות המחשוב והזיכרון של עיבוד תוצאות הביניים, ואת גודל הבייטים של התוצאות כשהן מוחזרות ללקוחות דרך הרשת. במקרים שבהם כל השדות שמוזכרים בשאילתה מכוסים על ידי אינדקס רגיל (לא multikey), השאילתה יכולה להיות מכוסה במלואה על ידי סריקת האינדקס, בלי צורך לאחזר מסמכים מהאחסון הראשי.
שימוש באינדקסים
כך מגדירים אינדקסים ומבצעים אופטימיזציה שלהם.
איך בודקים אם השאילתה משתמשת באינדקס
כדי לזהות אם השאילתה משתמשת באינדקס, בודקים את צומתי העלים בעץ הביצוע. אם צומת העלה של עץ הביצוע הוא צומת TableScan, המשמעות היא שהשאילתה לא משתמשת באינדקס וסורקת מסמכים מהאחסון הראשי. אם נעשה שימוש באינדקס, צומת העלה של עץ הביצוע יציג את מזהה האינדקס ואת שדות האינדקס של האינדקס.
איך בודקים אם אפשר לבצע אופטימיזציה של האינדקס שבו משתמשים
אינדקס שימושי לשאילתה אם הוא יכול להפחית את מספר המסמכים שמנוע השאילתות צריך לאחזר מהאחסון הראשי, או אם סדר השדות שלו יכול לספק את דרישת המיון של השאילתה.
אם נעשה שימוש באינדקס לשאילתה, אבל מנוע השאילתות עדיין מאחזר ומוחק מסמכים רבים, כפי שזוהה על ידי צומת סריקה שמחזיר רשומות רבות ואחריו צומת סינון שמחזיר מעט רשומות, זה סימן לכך שהפרדיקט של השאילתה שסופק באמצעות האינדקס לא סלקטיבי. כדי ליצור אינדקס מתאים יותר, קראו את המאמר יצירת אינדקסים.
אם נעשה שימוש באינדקס שאינו מרובה-מפתחות בשאילתה, אבל מנוע השאילתות עדיין מבצע סידור מחדש בזיכרון של קבוצת התוצאות, כפי שזוהה על ידי צומת MajorSort בעץ הביצוע של השאילתה, זה סימן לכך שלא ניתן להשתמש באינדקס שנעשה בו שימוש כדי לספק את דרישת המיון של השאילתה. כדי ליצור אינדקס מתאים יותר, עיינו בקטע הבא.
מתבצעת אופטימיזציה של $lookup שאילתות
כדי לבצע אופטימיזציה של שאילתות $lookup, אפשר להוסיף אינדקסים לאוסף from. כך הפעולה תוכל למצוא ביעילות מסמכים תואמים בלי לסרוק את כל האוסף.
$lookup עם localField ו-foreignField
אם אתם משתמשים באפשרויות localField ו-foreignField בשלב $lookup, צרו אינדקס ב-foreignField באוסף from.
$lookup עם צינורות עיבוד נתונים בתצוגת עץ
אם אתם משתמשים באפשרות pipeline בשלב $lookup עם שלבי $match, צרו אינדקס בשדות שמעורבים באוסף החיצוני כדי להימנע מסריקה מלאה של האוסף:
- בשלבי
$matchעם סמנטיקה של סינון (לדוגמה{$match: {a: true}}), צריך ליצור אינדקס בשדות שמעורבים באוסף החיצוני (a). - בשלבי
$matchעם סמנטיקה של צבירה שמשווה בין שדה לערך קבוע (לדוגמה{$match: {$expr: {$gt: [a, 10]}}}) או עם השוואות שוויון (eqאוin) בין שדות ומשתנים שמוגדרים ב-let(לדוגמה{$match: {$expr: {$eq: [a, "$$a"]}}}), צריך ליצור אינדקס בשדות שמעורבים באוסף החיצוני. שימו לב שאינדקס עם כמה מפתחות לא ישמש בתכנון.
יצירת אינדקסים
כדי ליצור אינדקסים, פועלים לפי ההוראות במסמכי התיעוד בנושא ניהול אינדקסים. כדי לוודא שהשאילתה יכולה להשתמש באינדקסים, צריך ליצור אינדקסים רגילים (לא עם כמה מפתחות) עם שדות בסדר הבא:
- כל השדות שישמשו באופרטורים של שוויון. כדי למקסם את הסיכוי לשימוש חוזר בשאילתות, סדרו את השדות בסדר יורד של הופעת השדות באופרטורים של שוויון בין שאילתות.
- כל השדות שלפיהם יתבצע המיון (באותו סדר).
- שדות שישמשו באופרטורים של טווח או אי-שוויון, בסדר יורד של סלקטיביות האילוצים בשאילתה.
- שדות שיוחזרו כחלק משאילתה באינדקס: הכללת שדות כאלה באינדקס מאפשרת לאינדקס לכסות את השאילתה, וכך לא צריך לאחזר את המסמך מהאחסון הראשי.
בשאילתות שכוללות סינון ומיון של שדות מערך, כדאי ליצור אינדקסים עם כמה מפתחות.
שימוש ברמז לשאילתה
אם יצרתם אינדקס שמתאים יותר לשאילתה, אבל מנוע השאילתות לא משתמש בו, אתם יכולים לשנות את העדפת האינדקס של מנוע השאילתות באמצעות רמז לשאילתה.
למידע נוסף על הפלט של שאילתה שבוצעה באמצעות Query Explain, ראו הפניית ביצוע שאילתה.