שיפור ביצועים בשרת SQL

14 ביוני 2009

תגובה אחת

אחד הרכיבים העמוסים ביותר במערכות Web הוא מסד הנתונים. מערכות Web 2 לסוגיהן כמו פורומים, לקוחות IM, מערכות מסרים וכו' נוהגות לנפח את המסד האומלל ולמלא אותו בערימות רבות ומגוונות של מידע, לעיתים כפול ומכופל.
המתכנת שמפתח את המערכת לרוב לא מודע להשלכות ולוקח זמן רב (שנים) עד שהבעיות בתכנון המקורי צצות ועולות, בעיקר עם עליית הפופולאריות של המערכת וחניקת ה-CPU של רכיביה.

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

מערכת מסרים

מערכת מסרים טיפוסית נראית ככה:

CREATE TABLE  `pb_messages` (
`m_id` int NOT NULL AUTO_INCREMENT,
  `m_from` int NOT NULL,
  `m_to` int NOT NULL,
  `m_title` varchar(155) NOT NULL DEFAULT '',
  `m_content` text NOT NULL DEFAULT '0',
  `m_new` tinyint NOT NULL DEFAULT '1',
  `m_date` datetime NOT NULL DEFAULT '1987-11-13 00:00:00',
`m_folder` int(11) NOT NULL DEFAULT '-1',
  PRIMARY KEY (`m_owner`,`m_id`)
) ;

ב-SQL Server הנפוץ יותר זה יראה קצת אחרת, אבל לא נורא. למעשה מדובר פה בטבלה פשוטה: מספר, אל, מאת, כותרת ותוכן, חדש (בולאני למעשה, למרות שאני העדפתי int), תאריך ותיקיה

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

עכשיו נדמיין לעצמנו מנגנון תגובה:
יצירת הודעה בדואר נכנס של המשתמש המקבל(ים?)
יצירת הודעה בדואר נכנס של השולח

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

נחזור לשולחן השרטוט ונבנה עוד שתי טבלאות

CREATE TABLE .`pb_topics` (
  `t_id` int NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`t_id`)
) ;

CREATE TABLE  `pb_links` (
  `l_id` int NOT NULL AUTO_INCREMENT,
  `l_user` int NOT NULL DEFAULT '0',
  `l_new` int NOT NULL DEFAULT '0',
  `l_topic` int NOT NULL DEFAULT '0',
  `l_visible` int NOT NULL DEFAULT '1',
  PRIMARY KEY (`l_id`) );

הודעה חדשה:

יצירת "שרשור" חדש (אני צריך רק את המספר הרציף האוטו')
יצירת הודעה חדשה, עם השרשור
הוספת כל מכותב לרשימת המקבלים

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

כמובן, יש עוד הרבה עבודה: צריך להוסיף אינדקסים לטבלאות על חתכי חיפוש נפוצים, צריך לבנות מנגנון עם טבלת זיכרון כלשהי כדי לשמור למי יש הודעה חדשה (לחסוך I/O יקר) ויש עוד הרבה עבודה כדי שהמערכת תתאים לעומס של ערץ 7 למשל.
חוסרים נוספים שקיימים הם השאילתות לבדיקת מספר ההודעות, שליפת דואר נכנס, שליפת דואר יוצא, הצגת התאריך העברי, התחשבות בהודעות שהמשתמש מחק וכו' שגם שם יש לא מעט עבודה.

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

 

פיתוח מהנה, והרבה הרבה שעות של אופטימיזציה מהנות עוד יותר !

הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

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

תגובה אחת

  1. חתול19 ביוני 2009 ב 0:05

    ערץ 7?
    תזהר שלא יפטרו אותך על כזו טעות.

    הגב