התלמוד של המפתחהתלמוד של המפתח

מסכת ביצועים

מסכת שאילתות הדאטהבייס

3 הלכות

א

עוון SELECT *

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

מעשה בדוולופר אחד שכתב שאילתה שהחזירה מאה אלף שורות, ואחר כך כתב בצד השרת: const user = results.find(u => u.id === userId). ראה זאת הדאטהבייס ובכה. ראה זאת השרת ובכה. ראה זאת המשתמש — לא ראה כלום, כי הדף לא נטען. יצאה בת קול ואמרה: WHERE. יש דבר כזה WHERE. השתמש בו. לא שמע הדוולופר, כי היה עסוק בלהסביר למנהל מדוע הדף איטי.

ב

עוון ה-N+1

N+1 הוא כשעושים שאילתה אחת לרשימה, ואחר כך שאילתה נוספת לכל פריט ברשימה. אם יש מאה פריטים — מאה ואחת שאילתות. אם יש אלף — אלף ואחת. אם יש עשרת אלפים — כבר לא משנה, כי השרת נפל.

שאלו: ומדוע זה קורה? אמר רב ששת: כי הדוולופר כתב קוד שנראה תמים — const orders = await getOrders(), ואחר כך לכל order: order.user = await getUser(order.userId). ונראה קריא. ונראה נקי. ואינו כן. אמר אביי: ומה העצה? אמר רב ששת: JOIN. המצאו אותו לפני חמישים שנה. עדיין עובד.

ג

מעשה בסטארטאפ

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

חקרו ומצאו: שאילתה בתוך לולאה בתוך לולאה בתוך לולאה, שלושה JOIN ללא אינדקסים, ו-SELECT * על טבלה של מיליון שורות שנקראה כל שניה. אמר המנכ"ל: מדוע לא בדקתם ביצועים? אמרו הדוולופרים: בדקנו. עבד מהר. אמר המנכ"ל: עם כמה דאטה? אמר אחד מהם בשקט: עם חמישה רשומות. ויצא המנכ"ל ולא שב.