我想将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();
}
}
答案 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
}