MySQL資料庫數據庫inset性能優化

我們在使用中MySQL的時候難免會遇到大批量數據inset的情況,通常最簡單的方法就是寫一個insert,然後通過循環給變量賦值,批量插入資料庫:

                //save rddform
                for (int i = 0; i < rddformlist.Count; i++)
                {
                    string cmdText = "insert into rddform (ID,CreatedTime,ModifiedTime,CreatedBy,ModifiedBy,FormType) values ('" + rddformlist[i].RddFormGuid + "','" + rddformlist[i].CreateTime + "','" + rddformlist[i].ModifyTime + "','" + rddformlist[i].CreateBy + "','" + rddformlist[i].ModifyBy + "'," + rddformlist[i].FormType + ")";
                    MySqlCommand mysqlcom = new MySqlCommand(cmdText, mysqlcon);
                    mysqlcom.Transaction = trans;  //綁定事務           
                    mysqlcom.ExecuteNonQuery();
                }

經過方法經過親測,性能不太好,本地大概是一秒insert20條數據,雲上大概是一秒insert3條數據。兩千條數據本地大概就要一分半,雲上大概十幾分,顯然速度太慢瞭。

現在我們改為多條數據合並插入,就是用一個insert語句插入所有的數據:

//save rddform
                for (int i = 0; i < rddformlist.Count; i++)
                {
                    strRddForm.Append("('" + rddformlist[i].RddFormGuid + "','" + rddformlist[i].CreateTime + "','" + rddformlist[i].ModifyTime + "','" + rddformlist[i].CreateBy + "','" + rddformlist[i].ModifyBy + "','" + rddformlist[i].FormType + "')");
                    if (i<rddformlist.Count-1)
                    {
                        strRddForm.Append(",");
                    }
                }
                MySqlCommand rddformcom = new MySqlCommand(strRddForm.ToString(), mysqlcon);
                rddformcom.Transaction = trans;  //綁定事務           
                rddformcom.ExecuteNonQuery();

親測之後兩千條本地真的是秒插,雲上大概一秒多,這速度讓人根本沒有拒絕的理由,果斷的把代碼改瞭。當然速度可能根據個人機器以及網絡環境因素有關,下面是網上牛人做的性能對比

<img src="/wp-content/images1/20181204/b2gzn5sxj5t.jpg" align="middle" width="295" height="109" alt="" />

註意事項:<br /> SQL語句是有長度限制,在進行數據合並在同一SQL中務必不能超過SQL長度限制,通過max_allowed_packet配置可以修改,默認是1M,測試時修改為8M。<br /> 事務需要控制大小,事務太大可能會影響執行的效率。MySQL有innodb_log_buffer_size配置項,超過這個值會把innodb的數據刷到磁盤中,這時,效率會有所下降。所以比 較好的做法是,在數據達到這個這個值前進行事務提交。<br /><br />

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *