10 טיפים חיוניים לביצועים עבור MySQL

כמו בכל מאגרי המידע ההתייחסותיים, MySQL יכול להתגלות כחיה מסובכת, כזו שיכולה לזחול לעצירה בהתראה של רגע ולהשאיר את היישומים שלך בעיצומה והעסק שלך על הפרק.

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

למרבה המזל, בעיות רבות בביצועי MySQL מתבררות כפתרונות דומים, מה שהופך את פתרון הבעיות וכוונון ה- MySQL למשימה ניתנת לניהול.

להלן 10 טיפים להפקת ביצועים מעולים מ- MySQL.

טיפ לביצועי MySQL מס '1: פרופיל את עומס העבודה שלך

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

הדרך הטובה ביותר לפרופיל את עומס העבודה שלך היא באמצעות כלי כגון מנתח השאילתות של MySQL Enterprise Monitor או ה- pt-query-digest מתוך ערכת הכלים של פרקונה. כלים אלה לוכדים שאילתות שהשרת מבצע ומחזירים טבלת משימות ממוינת לפי הקטנת סדר זמן התגובה, ומבעבעות באופן מיידי את המשימות היקרות והגוזלות ביותר לראש כך שתוכלו לראות היכן למקד את המאמצים שלכם.

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

טיפ לביצועי MySQL מס '2: להבין את ארבעת המשאבים הבסיסיים

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

הבנת המשאבים הבסיסיים חשובה בשני תחומים מסוימים: בחירת חומרה ופתרון בעיות.

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

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

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

טיפ לביצועי MySQL מס '3: אל תשתמש ב- MySQL כתור

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

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

טיפ לביצועי MySQL מס '4: סנן תוצאות לפי הזול ביותר

דרך נהדרת לבצע אופטימיזציה של MySQL היא קודם לעשות עבודה זולה ולא מדויקת, ואז העבודה הקשה והמדויקת על מערכת הנתונים הקטנה יותר וכתוצאה מכך.

לדוגמה, נניח שאתה מחפש משהו ברדיוס נתון של נקודה גיאוגרפית. הכלי הראשון בארגז הכלים של מתכנתים רבים הוא הנוסחה המעגלית הגדולה (Hversine) לחישוב מרחק על פני כדור. הבעיה בטכניקה זו היא שהנוסחה דורשת פעולות טריגונומטריות רבות, שעתידות מאוד CPU. חישובי מעגל גדול נוטים לרוץ לאט ולהפוך את השימוש במעבד המכונה לשמיים.

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

טיפ לביצועי MySQL מס '5: הכירו את שתי מלכודות המוות המדרגיות

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

קח את חוק המדרגיות האוניברסלית, הגדרה שימושית בביטוי וכימות מאפייני המדרגיות של המערכת. זה מסביר בעיות קנה מידה במונחים של שני עלויות בסיסיות: סידורי ודיבוי.

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

הימנע מסידורי ודיבוי שיחות, והיישום שלך ישתנה הרבה יותר טוב. מה זה מתורגם בתוך תוכנת MySQL? זה משתנה, אך כמה דוגמאות יהיו הימנעות מנעילות בלעדיות בשורות. תורים, נקודה מס '3 לעיל, נוטים להשתנות בצורה גרועה מסיבה זו.

טיפ לביצועי MySQL מס '6: אל תתמקד יותר מדי בתצורה

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

ברירות המחדל המועברות עם MySQL הן מידה אחת ומיושנת מאוד, אך אינך צריך להגדיר את הכל. עדיף לתקן את היסודות ולשנות הגדרות אחרות רק במידת הצורך. ברוב המקרים, אתה יכול להשיג 95 אחוז מביצועי השיא של השרת על ידי הגדרת כ -10 אפשרויות כהלכה. הסיטואציות המעטות בהן זה לא חל הולכות להיות מקרי קצה ייחודיים לנסיבות שלך.

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

טיפ לביצועי MySQL מס '7: היזהר משאלות עמוד

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

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

בצד השאילתה, במקום להשתמש LIMITב- offset, אתה יכול לבחור שורה יותר ממה שאתה צריך, וכאשר המשתמש לוחץ על הקישור "העמוד הבא", אתה יכול להגדיר את השורה הסופית כנקודת ההתחלה עבור קבוצת התוצאות הבאה. לדוגמא, אם המשתמש צפה בדף עם שורות 101 עד 120, היית בוחר גם בשורה 121; כדי לעבד את העמוד הבא, תשאיל את השרת בשורות שגדולות או שוות ל 121, מגבלה 21.

טיפ לביצועי MySQL מס '8: שמור נתונים סטטיסטיים בשקיקה, ערניים בחוסר רצון

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

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

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

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

טיפ לביצועי MySQL מס '9: למדו את שלושת כללי האינדקס

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

אינדקסים, כאשר הם מתוכננים כראוי, משרתים שלוש מטרות חשובות בשרת מסד נתונים:

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

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

טיפ לביצועי MySQL מס '10: נצל את המומחיות של עמיתייך

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

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

לאלו המחפשים כלים להשלמת טיפים אלה, תוכלו לבדוק את אשף התצורה של Percona עבור MySQL, את Percona Query Advisor עבור MySQL ותוספי ניטור של Percona. (הערה: יהיה עליך ליצור חשבון Percona כדי לגשת לשני הקישורים הראשונים. זה בחינם.) אשף התצורה יכול לעזור לך ליצור קובץ my.cnf בסיסי עבור שרת חדש העולה על קבצי הדוגמה המועברים עם ה- שרת. יועץ השאילתות ינתח את ה- SQL שלך בכדי לסייע באיתור דפוסים שעלולים להיות רעים כגון שאילתות עמוד (מס '7). תוספי ניטור של פרקונה הם קבוצה של תוספים לניטור ותרשימים שיעזרו לך לשמור נתונים סטטיסטיים בשקיקה ובהתראה (מס '8). כל הכלים הללו זמינים באופן חופשי.