提高mysql中插入的速度

时间:2015-11-12 15:27:25

标签: java mysql sql-insert

我想将7亿行插入到以下列方式定义的表中。

CREATE TABLE KeywordIndex (id INT PRIMARY KEY AUTO_INCREMENT,
 keyValue VARCHAR(45) NOT NULL, postings LONGTEXT NOT NULL);

要在表格中插入数据,我首先检查keyValue是否存在我通过将新值连接到旧值来更新过帐值。否则,将数据作为表的新行插入。此外,如果发布的大小大于其定义,我会考虑使用新行来编写keyValue的发布扩展。在我的实现中,插入70,294条目需要12小时!!!!

(我不是数据库专家,所以我编写的代码可能基于错误的基础。请帮助我理解我的错误:))

我看了this page,但我找不到解决问题的方法。

我添加了我编写的代码来执行此过程。

 public void writeTermIndex(
            HashMap<String, ArrayList<TermPosting>> finalInvertedLists) {

        try {


            for (String key : finalInvertedLists.keySet()) {

                     int exist=ExistTerm("KeywordIndex",key);
                     ArrayList<TermPosting> currentTermPostings=finalInvertedLists.get(key);
                      if (exist>0)
                      {
                          String postings=null;
                          String query = "select postings from KeywordIndex where keyValue=?";

                          PreparedStatement preparedStmt = conn.prepareStatement(query);

                          preparedStmt.setString (1, key);    
                          ResultSet  rs=preparedStmt.executeQuery();
                          if(rs.next())
                              postings=rs.getString("postings");

                          postings=postings+convertTermPostingsToString(currentTermPostings);

                          if(getByteSize(postings)>65530)
                                insertUpdatePostingList("KeywordIndex",key,postings);
                          else{

                              updatePosting("KeywordIndex",key,postings);
                              rs.close();
                              preparedStmt.close();
                          }

                      }

                      else
                      {
                          String postings=convertTermPostingsToString(currentTermPostings);
                          if(getByteSize(postings)>65530)
                            insertPostingList("KeywordIndex",key,postings);

                          else
                              insetToHashmap("KeywordIndex",key,postings);
                      }

                }

        }
        catch(Exception e){
             e.printStackTrace();
        }
 }

1 个答案:

答案 0 :(得分:0)

您应该考虑将executeBatch()用于插入(我不是在谈论您的请求的加载部分)。根据您的数据库,性能可能会发生很大变化(请参阅本page末尾的基准测试)(我曾经使用oracle数据库测试过它)

类似的东西:

PreparedStatement statement = null;
try {
    statement = getConnection().prepareStatement(insertQuerry);

    for (/*...*/) {
        statement.clearParameters();
        statement.setString(1, "Hi");                   
        statement.addBatch();
    }

    statement.executeBatch();
} catch (SQLException se) {
    //Handle exception
} finally {
    //Close everything
}