![]() |
יעילות מסד
יש לי מסד נתונים עם טבלה שמכילה חיפושים שבוצעו באתר. בטבלה יש כמה מאות אלפי רשומות, והמבנה שלה הוא:
ID מסוג INT שהוא האינדקס בטבלה text מסוג text מהטבלה אני מעוניין רק לשלוף נתונים ולא להכניס, וחשוב לי שזה יהיה כמה שיותר מהיר. מה אני יכול לעשות כדי לשפר את הביצועים? זה דיי דחוף, החברת איחסון יושבת לי על הראש... (לעבור שרת זה לא אופציה כרגע) תודה חבר'ה |
תלוי לפי מה אתה שולף אם אתה למשל עושה שאילתות בסגנון
select * from X where text ='BLa' אז הייתי מציע לך לשים אינדקס על השדה טקסט. http://beginner-sql-tutorial.com/sql-index.htm לגבי ה ID אם אתה כבר על שרת MYSQL או MSSQL וזה מפתח (כלומר הגדרת אותו כמפתח) אז זה אוטומטית כבר מוגדר אינדקס בגלל זה דיברתי רק על TEXT. חוץ מזה אם יש לך שאילתות שאתה מחפש צירוף של ID וטקסט אני מציע לך לעשות גם על הצירוף אינדקס. שים לב ששימוש ב INDEX יצרוך יותר זיכרון אבל השאילתות יבוצעו יותר מהר כלומר פחות עומס על המעבד. |
ציטוט:
והשאילתות הם כאלו: select `text`,`times` from `search` order by `time` limit 0,100 select `text` from `he` order by `time` limit 0,100 רק עם לימיט שונה בהתאם לדף. בכל מקרה ראיתי את זה: http://www.internet-israel.com/inter...9%D7%9C-mysql/ יש שם את המנוע Berkeley DB – BDB שנראה לי מתאים, אבל אני לא בטוח. אז האם זה יתאים עבורי? וזה מהדוח של השאילתות האיטיות: # Mon Aug 1 01:25:23 2011 # Query_time: 3.734186 Lock_time: 0.000106 Rows_sent: 100 Rows_examined: 320465 use ******; select `text`,`times` from `search` order by `time` limit 0,100 # Mon Aug 1 01:32:44 2011 # Query_time: 4.665496 Lock_time: 0.036117 Rows_sent: 100 Rows_examined: 322565 use *****; select `text`,`times` from `search` order by `time` limit 2100,100 |
אוקיי אני מניח (כיון שאני לא בטוח אם ORDER BY באמת ישופר עם אינדקס למרות שמבחינת הגיון של איך אינדקס עובד זה אמור לשפר) במקרה הזה אם תעשה אינדקס דוקא על TIME זה יהיה לך טוב אתה לא צריך אינדקס על TEXT כי אתה לא שולף לפיו.
על TIME הוא נותן לך לבצע אינדקס? (אפילו אם זה אפשרי אולי הייתי הולך על הפיכת TIME למפתח אם הוא יחודי ואילו 2 השאילתות היחידות שאתה מריץ ועושות בעיה.) לגבי מנועים אני לא יודע לא התנסתי בהבדלים השונים בניהם... |
צודק. שיניתי את השאילתא שתמיין לפי הid במקום הtime. נקווה שזה ישפר את הביצועים.
יש עוד עצות?? |
אכן אין טעם למיין לפי הזמן אם יש לך ID שמייצג בדיוק אותו הדבר (טיפ ראשון בייעול שאילתות).
מה המנוע של הטבלה שלך? נסה להשתמש ב-MyISAM. הוא לא טוב במקרה של עדכונים כי הוא נועל את כל הטבלה במקרה כזה, אבל לשליפה הוא יותר מהיר מאשר InnoDB. בכל אופן, יכול להיות שאפשר לעשות איזשהו קאשינג ולשים X רשומות אחרונות בטבלה קטנה ולשלוף ממנה? |
ציטוט:
וצודק, אני חושב שאני ישתמש בקאשינג, כי בכל מקרה העמודים האלה כבר לא מתעדכנים. |
כל הזמנים הם GMT +2. הזמן כעת הוא 07:13. |
מופעל באמצעות VBulletin גרסה 3.8.6
כל הזכויות שמורות ©
כל הזכויות שמורות לסולל יבוא ורשתות (1997) בע"מ