דוגמאות לתמחור

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

מומלץ להשתמש בתכונה Query Explain כדי להבין טוב יותר את העלות והביצועים של השאילתות הספציפיות שלכם.

פעולות קריאה

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

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

בטבלה הבאה מפורטים החיובים שקשורים להרצת שאילתות חיפוש טקסט מלא בקטלוג מוצרים של חנות אינטרנט למכירת צמחים. בדוגמה הזו מניחים שיש אוסף של 200,000 כרטיסי מוצר, שכל מסמך של כרטיס מוצר הוא בגודל 2KiB, וגודל אינדקס החיפוש המתאים הוא בערך 100MiB.

שאילתה קוד לדוגמה יחידות קריאה משוערות שנצרכו לכל שאילתה עלויות משוערות (אזור: us-central1 בדולר ארה"ב)
חיפוש של מוצר נדיר של מגש שטוח עם ערימה של "מים יבשים", שמביא לאחזור של 3 מסמכים.
db.products.find(
  {$text: {$search: '"dry water" stack flat'}}
);

‫10 יחידות קריאה בסך הכול

על סמך 7 יחידות לחיפוש טקסט מלא ו-3 יחידות נוספות למסמכים שמוחזרים.

‫$0.50 למיליון שאילתות
חיפוש של כל עצי ההדר לגידול בתוך הבית, שמחזיר 36 מסמכים.
db.products.find(
  {$text: {$search: '"indoor" "citrus" "tree"'}}
);

‫42 יחידות קריאה בסך הכול

בהתבסס על 6 יחידות לחיפוש טקסט מלא ו-36 יחידות נוספות למסמכים שהוחזרו.

‫2.10$ למיליון שאילתות
מחפשים עציצים למרפסת, שמופיעות הרבה תוצאות של מוצרים. ממיינים את התוצאות לפי רלוונטיות ומגבילים ל-50 תוצאות החיפוש הראשונות.
db.products.find(
  {$text: {$search: 'balcony planter'}}
).sort({score: {$meta: "textScore"}}).limit(50);

‫75 יחידות קריאה בסך הכול

על סמך 25 יחידות לחיפוש טקסט מלא ו-50 יחידות נוספות למסמכים שמוחזרים.

‫3.75$ למיליון שאילתות

הדוגמאות האלה ממחישות איך דפוסי שאילתות שונים משפיעים על העלויות:

  • השאילתה 'מים יבשים' כוללת ביטוי ("dry water") ומונחים נוספים. חיפושים של צירופי מילים הם מורכבים יותר, כי מנוע השאילתות צריך לבדוק את הקרבה והסדר של הטוקנים, ולכן הם תורמים 7 יחידות קריאה לשלב החיפוש. מכיוון שרק מעט מסמכים תואמים, עלות אחזור המסמכים נמוכה.
  • השאילתה 'עץ' 'הדרים' 'בתוך הבית' מחפשת שלושה מונחים נפרדים. המורכבות של כל מונח קטנה יותר בהשוואה לחיפוש של צירוף מילים, אבל עדיין צריך לחפש כמה טוקנים. עלות הסריקה של אינדקס החיפוש נמוכה יותר ועומדת על 6 יחידות קריאה, בהשוואה לדוגמה של 'מים יבשים', אבל המערכת מחזירה 36 מסמכים, ולכן העלות הכוללת גבוהה יותר.
  • השאילתה balcony planter היא היקרה ביותר מבין שאילתות החיפוש בטקסט מלא, עם עלות של 25 יחידות, בהפרש משמעותי. הסיבה העיקרית לכך היא שהיא מבקשת למיין את התוצאות לפי הרלוונטיות (.sort({score: {$meta: "textScore"}}) ) למונחים שתואמים למסמכים רבים. כדי לקבוע מהן 50 התוצאות הרלוונטיות ביותר, מנוע השאילתות צריך למצוא את כל ההתאמות האפשריות למונחים balcony או planter, לחשב את ציון הרלוונטיות של כל אחת מהן ואז למיין אותן. תהליך הניקוד והמיון הזה, שמתבצע על מספר גדול של מועמדים באינדקס, דורש הרבה משאבי מחשוב, גם אם בסופו של דבר מאוחזרים רק 50 מסמכים. היקף המונחים, בשילוב עם התקורה של ניקוד הרלוונטיות, מייקר את שלב החיפוש.

שאילתות גיאומרחביות

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

בטבלה הבאה מפורטים החיובים שקשורים להפעלת שאילתות גיאו-מרחביות באפליקציית מפות. בדוגמה הזו מניחים שיש אוסף של 1,000,000 מסמכים שמייצגים נקודות עניין, וכל מסמך של נקודת עניין הוא בגודל 1KiB, וגודל האינדקס הגיאוגרפי התואם הוא בערך 60MiB.

שאילתה קוד לדוגמה יחידות קריאה משוערות שנצרכו לכל שאילתה עלויות משוערות (אזור: us-central1 בדולר ארה"ב)
תמצא את כל נקודות העניין במרחק של עד 10 ק"מ, ותחזיר 10 התאמות.
db.pois.find(
  {location: {
    $near: {
      $geometry: <point>,
      $maxDistance: 10000
    }}})

16 יחידות קריאה בסך הכול.

על סמך 6 יחידות קריאה לשאילתה גיאו-מרחבית ו-10 יחידות נוספות למסמכים שהוחזרו.

‫$0.80 למיליון שאילתות
תמצא את כל המקומות שמעניינים אותי במרחק של עד 100 ק"מ, ותחזיר את 10 המקומות הכי קרובים מתוך 1,000 תוצאות.
db.pois.find(
  {location: {
    $near: {
      $geometry: <point>,
      $maxDistance: 100000
    }}}).limit(10)

‫19 יחידות קריאה בסך הכול.

על סמך 9 יחידות קריאה לשאילתה גיאו-מרחבית ו-10 יחידות נוספות למסמכים שהוחזרו.

‫$0.95 למיליון שאילתות

הדוגמאות האלה ממחישות איך דפוסי שאילתות שונים משפיעים על העלויות:

  • שאילתה עם רדיוס של 10 ק"מ: השאילתה הזו סורקת אזור גיאוגרפי קטן יותר. מכיוון שהמנוע מוצא רק 10 התאמות ברדיוס של 10 ק"מ, הוא צריך לבצע פחות עבודה כדי לזהות את הנקודות האלה ולסדר אותן לפי המרחק (כמו שקורה באופן מרומז ב-$near). כתוצאה מכך, עלות הסריקה של האינדקס תהיה נמוכה יותר ותסתכם ב-6 יחידות קריאה.
  • שאילתה עם רדיוס של 100 ק"מ: השאילתה הזו מכסה אזור גדול בהרבה. השאילתה מוצאת 1,000 התאמות פוטנציאליות ברדיוס של 100 ק"מ. כדי למלא את הבקשה ל-10 הנקודות הקרובות ביותר, מנוע השאילתות צריך לחשב מרחקים ולמיין קבוצה גדולה בהרבה של מועמדים (עד 1,000 נקודות) באינדקס. העבודה החישובית הנוספת של סינון ודירוג של הרבה יותר נקודות היא הסיבה לכך שעלות השאילתה הגיאו-מרחבית גבוהה יותר – 9 יחידות קריאה, לעומת השאילתה של 10 ק"מ, למרות שגם היא מחזירה רק 10 מסמכים.

קריאות נקודתיות

דוגמה לחיוב על קריאות של נקודות:

  • קריאת נקודה של מסמך יחיד בגודל 1KiB. צריכה: יחידת קריאה אחת
  • קריאת נקודה של מסמך יחיד בגודל 4KiB. צריכה: יחידת קריאה אחת
  • קריאת נקודה של מסמך יחיד בגודל ‎1 MiB. צריכה: 256 יחידות קריאה
  • קריאת נקודה של 100 מסמכים, כל אחד בגודל 1KiB. השימוש: 100 יחידות קריאה

סריקה

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

סריקת מסמכים

  • שאילתה שסורקת 100 מסמכים, כל אחד בגודל ‎1 KiB. הצריכה: 25 יחידות קריאה

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

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

  • שאילתה שסורקת 100 רשומות באינדקס, כל אחת בגודל ‎1 KiB. צריכה: 25 יחידות קריאה.
  • שאילתה שסורקת 100 רשומות באינדקס, כל אחת בגודל 128 בייט. השימוש: 4 יחידות קריאה.

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

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

  • ספירת מספר המסמכים באוסף. השאילתה סורקת 1,000 פריטים באוסף. השימוש: 8 יחידות קריאה.

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

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

  • שאילתה שסורקת 128 רשומות אינדקס, כל אחת בגודל 256 בייט, ומבצעת קריאה נקודתית של 128 מסמכים, כל אחד בגודל 4KiB. השימוש: 136 יחידות קריאה, שכוללות:
    • ‫128 יחידות קריאה לקריאות של נקודות
    • ‫8 יחידות קריאה לסריקות אינדקס

הסבר על שאילתה

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

העלויות הבאות חלות כשמשתמשים ב-Query Explain:

  • Query Explain שמריץ את השאילתה: חלה עלות על השאילתה.
  • שאילתת הסבר באמצעות האפשרות 'תוכנית בלבד'. צריכה: יחידת קריאה אחת (העלות המינימלית של שאילתה)

פעולות כתיבה

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

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

דוגמאות:

יצירה

  • יצירת מסמך חדש בגודל 10KiB ללא אינדקסים. העלות: 10 יחידות כתיבה
  • צריך ליצור מסמך בגודל 1KiB עם רשומה אחת באינדקס בגודל 256 בייט באוסף. צריכה: 2 יחידות כתיבה

עדכונים

  • איתור מסמך בגודל 10KiB לפי מזהה המסמך ועדכון שלו ללא אינדקסים באוסף. צריכה: 10 יחידות כתיבה
  • חיפוש מסמך בגודל 1KiB לפי מזהה המסמך ועדכון שדה אחד עם רשומה אחת באינדקס בגודל 256 בייט. הפעולה צורכת: 3 יחידות כתיבה. הערה: עדכון של רשומה באינדקס במצב הזה צורך 2 יחידות כתיבה – אחת למחיקה ואחת ליצירה מחדש של הרשומה באינדקס.
  • חיפוש מסמך בגודל 1KiB לפי מזהה המסמך, בלי לבצע עדכון (ללא שינויים). העלות: יחידת כתיבה אחת (העלות המינימלית לכתיבה)
  • שאילתה של כל המסמכים בגודל 1KB באוסף, שסורקת 1,000 מסמכים, והוספה של שדה חדש בגודל 256 בייט ללא אינדקסים באוסף: 1,000 יחידות קריאה ו-1,000 יחידות כתיבה.

מוחק

  • מחיקת מסמך בגודל 1KiB, שיש לו אינדקס אחד באוסף. צריכה: 2 יחידות כתיבה
  • מחיקת מסמך בגודל 1KiB, שלא כולל אינדקסים באוסף. צריכה: יחידת כתיבה אחת

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

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

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