Cache עבור שאילתות עדכון
English: How to Caching updates to minimize I/O cost of these operations, for example – counting views on forum message. the solution I provided is to create a table/static variable that holds updates "log" and update the main heavy table with timer. For example – for counting forum message views, I add row to some log table (that I can store in somewhere else, like RAM drive or MySQL Memory table) with timer updates main table and empty the log table for fast access later.
הבעיה:
שרת SQL Server 2005 של מערכת Web. ניתוח זריז של צג הביצועים העלה כי לשרת הנ"ל אין בעיית CPU אלא בעיית I/O חמורה. את בעיית השליפות (select) מהשרת פתרנו בקלות יחסית אבל בדיקה קצרה בשרת ה-SQL מצאה שעיקר הבעיה היה בשאילתות עדכון רבות ומאסיביות שגררו תור ארוך ואיטיות בגישה לכונן הקשיח.
אגירת שאילתות עדכון
נדמיין למשל דף פורום עצי כמו בערוץ 7 או תפוז. בדף יש מספר שליפות לכותרת ומנהלי הפורום וכו', לתוכן השרשור ולחתימות המשתמשים.
בהנחה שבניית הדף נעשית בצד לקוח, אפשר לשמור את כל המידע הרלוונטי במטמון, אבל מה עם פעולת העדכון של צפיות בשרשורים?
פעולת העדכון הפשוטה גורמת לנעילות חוזרות ונשנות על הטבלה, שפגעו אנושות בביצועי הפורום.
אני בחרתי בפיתרון שונה.
ראשית, ניצור טבלה חדשה, נניח forum_views. יצרתי בה רק שני שדות – PK ומספר הודעה. אם זה היה MySQL הייתי מגדיר אותה כטבלת זיכרון.
אם זה היה ASP.net אפשר לעשות את זה גם על ידי משתנה סטטי ו-Interlocked, זה יהיה אפילו טוב יותר במגבלות מסויימות.
כאשר גולש צופה בשרשור, נעדכן את הטבלה הזמנית, או המשתנה אותה אפשר לאחסן במקום אחר.
פעם בדקה-שתיים נבצע שליפה של כל העדכונים, ונעדכן את הטבלה הראשית פעם אחת.
במקום למשל לבצע שוב ושוב
update forum_messages set m_views=m_views+1
פעם בדקה, נבצע את זה:
update forum_messages set m_views=m_views+20
כאשר 20 זה מספר הצפיות, ואחרי העדכונים כמובן לרוקן את הטבלה הזמנית או המערך/משתנה. הירידה בעומס שבשרת הורגשה מיידית.