<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          你向 MySQL 數(shù)據(jù)庫插入 100w 條數(shù)據(jù)用了多久?

          共 8840字,需瀏覽 18分鐘

           ·

          2021-06-03 01:22

          點擊上方“碼農(nóng)突圍”,馬上關(guān)注
          這里是碼農(nóng)充電第一站,回復(fù)“666”,獲取一份專屬大禮包
          真愛,請設(shè)置“星標”或點個“在看
          作者 | 良月柒
          來源 | http://juejin.im/post/5d255ab9e51d454f73356dcd

          多線程插入(單表)

          問:為何對同一個表的插入多線程會比單線程快?同一時間對一個表的寫操作不應(yīng)該是獨占的嗎?
          答:在數(shù)據(jù)里做插入操作的時候,整體時間的分配是這樣的:
          • 鏈接耗時 (30%)
          • 發(fā)送query到服務(wù)器 (20%)
          • 解析query (20%)
          • 插入操作 (10% * 詞條數(shù)目)
          • 插入index (10% * Index的數(shù)目)
          • 關(guān)閉鏈接 (10%)
          從這里可以看出來,真正耗時的不是操作,而是鏈接,解析的過程。
          MySQL插入數(shù)據(jù)在寫階段是獨占的,但是插入一條數(shù)據(jù)仍然需要解析、計算、最后才進行寫處理,比如要給每一條記錄分配自增id,校驗主鍵唯一鍵屬性,或者其他一些邏輯處理,都是需要計算的,所以說多線程能夠提高效率。

          多線程插入(多表)

          分區(qū)分表后使用多線程插入。

          預(yù)處理SQL

          • 普通SQL,即使用Statement接口執(zhí)行SQL
          • 預(yù)處理SQL,即使用PreparedStatement接口執(zhí)行SQL
          使用PreparedStatement接口允許數(shù)據(jù)庫預(yù)編譯SQL語句,以后只需傳入?yún)?shù),避免了數(shù)據(jù)庫每次都編譯SQL語句,因此性能更好。

          String sql = "insert into testdb.tuser (name, remark, createtime, updatetime) values (?, ?, ?, ?)";
          for (int i = 0; i < m; i++) {
              //從池中獲取連接
              Connection conn = myBroker.getConnection();
              PreparedStatement pstmt = conn.prepareStatement(sql);
              for (int k = 0; k < n; k++) {
                      pstmt.setString(1, RandomToolkit.generateString(12));
                      pstmt.setString(2, RandomToolkit.generateString(24));
                      pstmt.setDate(3new Date(System.currentTimeMillis()));
                      pstmt.setDate(4new Date(System.currentTimeMillis()));
                      //加入批處理
                      pstmt.addBatch();
              }
              pstmt.executeBatch();    //執(zhí)行批處理
              pstmt.close();
              myBroker.freeConnection(conn); //連接歸池
          }

          多值插入SQL

          • 普通插入SQL:INSERT INTO TBL_TEST (id) VALUES(1)
          • 多值插入SQL:INSERT INTO TBL_TEST (id) VALUES (1), (2), (3)
          使用多值插入SQL,SQL語句的總長度減少,即減少了網(wǎng)絡(luò)IO,同時也降低了連接次數(shù),數(shù)據(jù)庫一次SQL解析,能夠插入多條數(shù)據(jù)。

          事務(wù)(N條提交一次)

          在一個事務(wù)中提交大量INSERT語句可以提高性能。
          1、將表的存儲引擎修改為myisam 2、將 sql 拼接成字符串,每 1000 條左右提交事務(wù)。

          /// <summary>
                  /// 執(zhí)行多條SQL語句,實現(xiàn)數(shù)據(jù)庫事務(wù)。
                  /// </summary>mysql數(shù)據(jù)庫
                  /// <param name="SQLStringList">多條SQL語句</param>
                  public void ExecuteSqlTran(List<string> SQLStringList)
                  
          {
                      using (MySqlConnection conn = new MySqlConnection(connectionString))
                      {
                          if (DBVariable.flag)
                          {
                              conn.Open();
                              MySqlCommand cmd = new MySqlCommand();
                              cmd.Connection = conn;
                              MySqlTransaction tx = conn.BeginTransaction();
                              cmd.Transaction = tx;
                              try
                              {
                                  for (int n = 0; n < SQLStringList.Count; n++)
                                  {
                                      string strsql = SQLStringList[n].ToString();
                                      if (strsql.Trim().Length > 1)
                                      {
                                          cmd.CommandText = strsql;
                                          cmd.ExecuteNonQuery();
                                      }
                                      //后來加上的
                                      if (n > 0 && (n % 1000 == 0 || n == SQLStringList.Count - 1))
                                      {
                                          tx.Commit();
                                          tx = conn.BeginTransaction();
                                      }
                                  }
                                  //tx.Commit();//原來一次性提交
                              }
                              catch (System.Data.SqlClient.SqlException E)
                              {
                                  tx.Rollback();
                                  throw new Exception(E.Message);
                              }
                          }
                      }
                  }
          10w條數(shù)據(jù)大概用時10s!
          - END -

          最近熱文

          ?  他是世界上最杰出程序員之一,1 個月寫了個操作系統(tǒng),退休后去做飛行員!
          ?  開掛的00后!17歲「天才少女」被8所世界名校錄取,最終選擇MIT計算機系
          ?  微信沙雕功能“炸屎”上線!網(wǎng)友:滿屏的粑粑真可愛
          ?  對比安卓!鴻蒙OS 2.0流暢度實測:差距到底多大?

          瀏覽 48
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  人人精品一起草 | 午夜成人视频 | 亚洲黄色精品视频 | 三区在线观看视频 | 乱伦影音 |