
07-12-2007, 20:45
|
|
|
|
חבר מתאריך: 13.12.05
הודעות: 1,963
|
|
אתה צודק שדבר כזה יכול לבזבז משאבים למסד הנתונים, תלוי איך אתה מתכנן את מה שנקרא "טבלת" המחוברים.
בטבלת מחוברים מומלץ לדוגמה, לשמור כערכי בסיס, את ה session_id של המשתמש בPHP (הוא צריך להיות ייחודי לכל משתמש) ואת זמן העדכון האחרון, ואם אתה רוצה אתה יכול להוסיף את הID של המשתמש במערכת שלך (במידה וזה משתמש מחובר).
אני ממליץ לך לקרוא את פרק האופטימיזציה, או לפחות חלקים שלו שקשורים לINDEX.
אם אתה מבצע את כל זה נכון, הטבלה לא צריכה להוות בעיה.
כמה טיפים שלי לעבודה עם טבלה כזו:
- המפתח הראשי לא צריך להיות מספר רץ, מספיק שהוא יהיה ה session_id מPHP.
סביר להניח, שאיך שלא תנסה ליצור את זה, session_id בPHP יעבוד יותר טוב ממה שתוכל ליצור אתה לכל משתמש. ועכשיו ליתרון הגדול של זה כמפתח ראשי בעת עדכון הטבלה, כל מה שתצטרך להריץ בכל עמוד, הוא רק שאילתה אחת:
קוד PHP:
mysql_query("INSERT LOW_PRIORITY INTO onlines SET id = '".session_id()."', timestamp = UNIX_TIMESTAMP(NOW()), user_id = $user_id ON DUPLICATE KEY UPDATE timestamp = UNIX_TIMESTAMP(NOW()), user_id = $user_id");
הסבר קצר:
LOW PRIORITY - יגרום לכך שהשאילתה לא תעכב את זמן הטעינה של המשתמש ותחזור מיד כש MySQL ירשום אותה ב buffer בצד.
ON DUPLICATE KEY UPDATE - יגרום לכך שבעת ה INSERT, במידה וקיים session_id כזה, הוא רק יתעדכן - ויחסוך לך זמן של SELECT לבדיקה אם הוא קיים. - תיצור INDEX למה שצריך, לדוגמה: שדה זמן עדכון, שדה של מספר המזהה משתמש מחובר.
INDEXים, כמו שתקרא, יגרמו לטבלה לעבוד הרבה יותר מהר. - תגדיר את הטבלה כטבלת MEMORY
יכול להיות שימליצו לך לא לעשות זאת, אני ממליץ שכן.
נכון שיש חסרון אחד שכל המידע "אובד" כאשר MySQL כבה או כשהשרת מתאתחל.
בסך הכל, טבלת המשתמשים המחוברים אינה מעניינת את המערכת הקבועה שמחזיקה את כל שאר המידע, אז המידע שיש בה ממילא לא נחוץ לעוד 3 דקות מכל זמן מוגדר.
|