דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. שיפור ביצועים של אלפי inserts בשניה בMYSQL

שיפור ביצועים של אלפי inserts בשניה בMYSQL

מתוזמן נעוץ נעול הועבר תכנות
20 פוסטים 5 כותבים 659 צפיות 5 עוקבים
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
תגובה
  • תגובה כנושא
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • nigunN nigun

    @OdedDvir

    "INSERT INTO `answers`  (`room`,`questionId`,`answerId`,`answerText`) VALUES ( "12345", "2", "1", "מה פרשת השבוע?")"
    
    dovidD
    dovidD
    dovid
    ניהול
    כתב ב נערך לאחרונה על ידי
    #11

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

    • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
    • בכל נושא אפשר ליצור קשר dovid@tchumim.com
    תגובה 1 תגובה אחרונה
    1
    • nigunN
      nigunN
      nigun
      כתב ב נערך לאחרונה על ידי
      #12

      חשבתי לקחת מסד נתונים מנוהל בdigitalocean
      זה יעזור לי?

      מייל: nigun@duck.com

      תגובה 1 תגובה אחרונה
      0
      • nigunN
        nigunN
        nigun
        כתב ב נערך לאחרונה על ידי nigun
        #13

        עכשיו שמתי לב שטעיתי
        מדובר בטבלה אחרת

         CREATE TABLE `points` (
        `id` INT(10) NOT NULL AUTO_INCREMENT,
        `room` INT(11) NULL DEFAULT NULL,
        `user` VARCHAR(20) NULL DEFAULT NULL,
        `questionId` INT(11) NULL DEFAULT NULL,
        `points` INT(11) NULL DEFAULT NULL,
        `time` INT(64) NULL DEFAULT NULL,  
        `grup` VARCHAR(64) NULL DEFAULT NULL,
        `answerId` INT(11) NULL DEFAULT NULL,   
                PRIMARY KEY (`id`)"
        
        

        הסטטוס שלה הוא

        mysql> show table status WHERE Name   =  'points';
        +--------+--------+---------+------------+--------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+--------------------+----------+----------------+---------+
        | Name   | Engine | Version | Row_format | Rows   | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time | Check_time | Collation          | Checksum | Create_options | Comment |
        +--------+--------+---------+------------+--------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+--------------------+----------+----------------+---------+
        | points | InnoDB |      10 | Compact    | 553311 |             82 |    45678592 |               0 |            0 |   4194304 |        1599099 | 2020-08-11 21:53:07 | NULL        | NULL       | utf8mb4_unicode_ci |     NULL |                |         |
        +--------+--------+---------+------------+--------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+--------------------+----------+----------------+---------+
        
        

        והשאילתא נראת כך

         INSERT INTO `points`  (`room`,`user`,`questionId`,`points`,`time`,`grup`,`answerId`) VALUES (?,?,?,?,?,?,? )", room, user, questionId, points, time, grup, answerId
        
        

        קצת יותר גדול
        אבל לא נראה לי שאמור להפריע כל כך

        מייל: nigun@duck.com

        OdedDvirO תגובה 1 תגובה אחרונה
        0
        • nigunN nigun

          עכשיו שמתי לב שטעיתי
          מדובר בטבלה אחרת

           CREATE TABLE `points` (
          `id` INT(10) NOT NULL AUTO_INCREMENT,
          `room` INT(11) NULL DEFAULT NULL,
          `user` VARCHAR(20) NULL DEFAULT NULL,
          `questionId` INT(11) NULL DEFAULT NULL,
          `points` INT(11) NULL DEFAULT NULL,
          `time` INT(64) NULL DEFAULT NULL,  
          `grup` VARCHAR(64) NULL DEFAULT NULL,
          `answerId` INT(11) NULL DEFAULT NULL,   
                  PRIMARY KEY (`id`)"
          
          

          הסטטוס שלה הוא

          mysql> show table status WHERE Name   =  'points';
          +--------+--------+---------+------------+--------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+--------------------+----------+----------------+---------+
          | Name   | Engine | Version | Row_format | Rows   | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time | Check_time | Collation          | Checksum | Create_options | Comment |
          +--------+--------+---------+------------+--------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+--------------------+----------+----------------+---------+
          | points | InnoDB |      10 | Compact    | 553311 |             82 |    45678592 |               0 |            0 |   4194304 |        1599099 | 2020-08-11 21:53:07 | NULL        | NULL       | utf8mb4_unicode_ci |     NULL |                |         |
          +--------+--------+---------+------------+--------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+--------------------+----------+----------------+---------+
          
          

          והשאילתא נראת כך

           INSERT INTO `points`  (`room`,`user`,`questionId`,`points`,`time`,`grup`,`answerId`) VALUES (?,?,?,?,?,?,? )", room, user, questionId, points, time, grup, answerId
          
          

          קצת יותר גדול
          אבל לא נראה לי שאמור להפריע כל כך

          OdedDvirO
          OdedDvirO
          OdedDvir
          כתב ב נערך לאחרונה על ידי OdedDvir
          #14

          @nigun אני גם לא חושב שזה אמור כל כך להפריע, אבל לפי התאור הראשוני גם מבוצעות שאילתות SELECT ו-INSERT בו זמנית על טבלה זו, ועם חצי מליון שורות אני חושב שכדאי מאוד היה לנרמל את הנתונים עוד יותר, למשל

          1. כדאי להפוך את כל השדות של ה-VARCHAR ל-INT.
            user => UserId
            grup => groupId
            וליצור טבלאות עבור Groups ו- Users.
          2. לחשוב טוב האם כל השדות האלו הכרחיים לשמירה עבור כל תשובה?
          3. אם time הוא רק חותמת זמן, הייתי משאיר זאת לבסיס הנתונים לקבוע ערך ברירת מחדל עבור השדה (=לזמן הנוכחי) ומסיר אותו מה-INSERT.
          4. כמה שתקטין יותר את הטבלה המהירות תהיה כנראה טובה יותר. יש לך 4 גורמים שאחראים על המהירות הכללית: מעבד, זיכרון, דיסק ורשת. תבדוק את כולם. אם למשל כל הנתונים לא נטענים לזיכרון בבת אחת, הDB יבצע קאשינג והמהירות תרד פלאים בשעות העומס...
          5. אני נזכר שכבר היתה לך איזו בעיה כזו בעבר, וה Execution Plan של ה-DB לא היתה אופטימלית. לפי זכרוני השתמשת בגירסא מיושנת של MySQL, ואולי כדאי לבצע שדרוג.
          תגובה 1 תגובה אחרונה
          3
          • שואףש
            שואףש
            שואף
            כתב ב נערך לאחרונה על ידי
            #15

            @nigun איך אתה רואה הסטטוס של הMYSQL ? עם NETDATA ?

            ליצירת קשר: admin@i-call.me

            הידד! גישה למייל גם בלי מחשב ואינטרנט!

            nigunN תגובה 1 תגובה אחרונה
            0
            • שואףש שואף

              @nigun איך אתה רואה הסטטוס של הMYSQL ? עם NETDATA ?

              nigunN
              nigunN
              nigun
              כתב ב נערך לאחרונה על ידי nigun
              #16

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

              מייל: nigun@duck.com

              תגובה 1 תגובה אחרונה
              0
              • nigunN
                nigunN
                nigun
                כתב ב נערך לאחרונה על ידי
                #17

                לבנתיים פתחתי מסד נתונים בDO
                אולי זה יתן ביצועים יותר טובים
                לבנתיים אני רואה שיש ממשק נחמד עם סטיסטיקות מורחבות
                cloud.digitalocean.com_databases_db-mysql-fra1-21586_logs_i=05fb21.png

                מייל: nigun@duck.com

                תגובה 1 תגובה אחרונה
                0
                • nigunN
                  nigunN
                  nigun
                  כתב ב נערך לאחרונה על ידי nigun
                  #18

                  עכשיו היה לי כ650 משתמשים על המערכת
                  וזה אולי נותן קצת יותר תמונה (נראה לי שהנתונים של DO יותר מדוייקים)
                  כפי שרואים בתמונה אין כל כל הרבה inserts בו זמנית, אלא fetchs
                  מה זה fetch? ולמה יש לי כל כך הרבה בשניה?
                  עריכה: אני מבין שזה כתוב השורות במסד נתונים מדפיס בSELECT
                  אז כנראה שזה לא בעיה.
                  בכל אופן נראה שהמסד נתונים של DO מתמודד עם זה יפה (הCPU ממש נמוך)
                  אולי בגלל שהוא משתמש בגירסה 8.0?

                  צילום מסך מ־2020-10-15 23-19-32.png

                  מייל: nigun@duck.com

                  OdedDvirO תגובה 1 תגובה אחרונה
                  0
                  • nigunN nigun

                    עכשיו היה לי כ650 משתמשים על המערכת
                    וזה אולי נותן קצת יותר תמונה (נראה לי שהנתונים של DO יותר מדוייקים)
                    כפי שרואים בתמונה אין כל כל הרבה inserts בו זמנית, אלא fetchs
                    מה זה fetch? ולמה יש לי כל כך הרבה בשניה?
                    עריכה: אני מבין שזה כתוב השורות במסד נתונים מדפיס בSELECT
                    אז כנראה שזה לא בעיה.
                    בכל אופן נראה שהמסד נתונים של DO מתמודד עם זה יפה (הCPU ממש נמוך)
                    אולי בגלל שהוא משתמש בגירסה 8.0?

                    צילום מסך מ־2020-10-15 23-19-32.png

                    OdedDvirO
                    OdedDvirO
                    OdedDvir
                    כתב ב נערך לאחרונה על ידי OdedDvir
                    #19

                    @nigun אמר בשיפור ביצועים של אלפי inserts בשניה בMYSQL:

                    מה זה fetch?

                    אני לא מכיר את DO אבל לכאורה fetch זו קריאת שורה מטבלה (SELECT)

                    ולמה יש לי כל כך הרבה בשניה?

                    כי יש הרבה קריאות.

                    nigunN תגובה 1 תגובה אחרונה
                    2
                    • OdedDvirO OdedDvir

                      @nigun אמר בשיפור ביצועים של אלפי inserts בשניה בMYSQL:

                      מה זה fetch?

                      אני לא מכיר את DO אבל לכאורה fetch זו קריאת שורה מטבלה (SELECT)

                      ולמה יש לי כל כך הרבה בשניה?

                      כי יש הרבה קריאות.

                      nigunN
                      nigunN
                      nigun
                      כתב ב נערך לאחרונה על ידי nigun
                      #20

                      @OdedDvir
                      מסתבר שכן
                      כי בלוג מככבים לי הרבה שאילתות של SELECT (שלפעמים לקחו 217 ms)
                      (ועכשיו אני נזכר שיש איזה קטע קוד שהשתוללתי שם עם השאילתות)
                      צילום מסך מ־2020-10-15 23-36-01.png

                      מייל: nigun@duck.com

                      תגובה 1 תגובה אחרונה
                      0

                      שלום! נראה שהשיחה הזו מעניינת אותך, אבל עדיין אין לך חשבון.

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

                      בעזרת התרומה שלך, הפוסט הזה יכול להיות אפילו טוב יותר 💗

                      הרשמה התחברות
                      תגובה
                      • תגובה כנושא
                      התחברו כדי לפרסם תגובה
                      • מהישן לחדש
                      • מהחדש לישן
                      • הכי הרבה הצבעות


                      בא תתחבר לדף היומי!
                      • התחברות

                      • אין לך חשבון עדיין? הרשמה

                      • התחברו או הירשמו כדי לחפש.
                      • פוסט ראשון
                        פוסט אחרון
                      0
                      • דף הבית
                      • קטגוריות
                      • פוסטים אחרונים
                      • משתמשים
                      • חיפוש
                      • חוקי הפורום