אופטימיזציה של ביצועי השאילתות

כדי לפתור בעיות של שאילתות איטיות, אפשר להשתמש בהסבר על שאילתות כדי לקבל את תוכנית ההפעלה של השאילתה ואת פרופיל ההפעלה בזמן הריצה. בקטע הבא מתוארים השלבים שאפשר לבצע כדי לשפר את ביצועי השאילתות, בהתאם לפרופיל הביצוע:

הגבלת מספר התוצאות

כדי לזהות אם השאילתה מחזירה הרבה מסמכים, השתמשו בשדה records returned בעץ הביצוע. כדאי להגביל את מספר המסמכים שמוחזרים באמצעות הסעיף $limit. כך אפשר לצמצם את גודל הבייטים של התוצאות שעברו סריאליזציה כשהן מוחזרות ללקוחות דרך הרשת. במקרים שבהם לפני הצומת Limit יש צומת MajorSort, מנוע השאילתות יכול לאחד את הצמתים Limit ו-MajorSort ולהחליף את ההתממשקות המלאה בזיכרון ואת המיון במיון 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"]}}}), צריך ליצור אינדקס בשדות שמעורבים באוסף החיצוני. שימו לב שאינדקס עם כמה מפתחות לא ישמש בתכנון.

יצירת אינדקסים

פועלים לפי ההוראות במסמכי התיעוד בנושא ניהול אינדקסים כדי ליצור אינדקסים. כדי לוודא שהשאילתה יכולה להשתמש באינדקסים, צריך ליצור אינדקסים רגילים (לא Multikey) עם שדות בסדר הבא:

  1. כל השדות שישמשו באופרטורים של שוויון. כדי למקסם את הסיכוי לשימוש חוזר בשאילתות, צריך לסדר את השדות בסדר יורד של הופעת השדות באופרטורים של שוויון בין שאילתות.
  2. כל השדות שלפיהם יתבצע המיון (באותו סדר).
  3. שדות שישמשו באופרטורים של טווח או אי-שוויון בסדר יורד של סלקטיביות אילוצי השאילתה.
  4. שדות שיוחזרו כחלק משאילתה באינדקס: הכללת שדות כאלה באינדקס מאפשרת לאינדקס לכסות את השאילתה, וכך לא צריך לאחזר מסמכים מהאחסון הראשי.

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

שימוש ברמז לשאילתה

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

למידע נוסף על הפלט של שאילתה שבוצעה באמצעות Query Explain, ראו הפניית ביצוע שאילתה.