【发布时间】:2017-10-02 09:20:58
【问题描述】:
我的问题如下:
CSV 文件以给定的时间间隔从服务器下载。
必须解析文件(必须去除不必要的空格)。
必须为每个条码更新商品价格、建议零售价和库存数量。
每个 CSV 行包含商品编号、产品名称、仓库 ID、仓库名称、价格、rrp 价格、库存和条形码。 items 表包含大约 71000 行。并且条形码不是数据库中的唯一键(因为具有相同条形码的物品可以在不同的仓库中)。问题是在 localhost MySQL 服务器上更新需要一个多小时(SQLite 大约半小时)。有什么方法可以优化 SQL 查询以使事情变得更快?我当前的代码如下所示:
public void updateData (BufferedReader bufferedReader, Connection sqlConnection){
String csvLine = null;
PreparedStatement preparedStatement = null;
String sqlString = "UPDATE items SET price = ?, rrp = ?, stock = ? WHERE departmentid = ? AND barcode = ?";
try {
preparedStatement = sqlConnection.prepareStatement(sqlString);
while ((csvLine = bufferedReader.readLine()) != null) {
String[] splitLine = csvLine.split(";");
preparedStatement.setBigDecimal(1, new BigDecimal(splitLine[4].trim()).setScale(2, RoundingMode.CEILING));
preparedStatement.setBigDecimal(2, new BigDecimal(splitLine[5].trim()).setScale(2, RoundingMode.CEILING));
preparedStatement.setInt(3, Integer.parseInt(splitLine[6].trim()));
preparedStatement.setString(4, splitLine[2].trim());
preparedStatement.setString(5, splitLine[8].trim());
preparedStatement.executeUpdate();
}
} catch (IOException | SQLException exc) {
System.out.println(exc.getMessage());
} finally {
try {
sqlConnection.commit();
preparedStatement.close();
sqlConnection.close();
} catch (SQLException exc) {
exc.printStackTrace();
}
}
}
到目前为止,最快的解决方案看起来像 @e4c5 建议的那样,将 CSV 数据加载到临时表并使用查询:
UPDATE items INNER JOIN temp_table ON items.barcode = temp_table.barcode SET items.rrp = temp_table.rrp, items.price = temp_table.price, items.stock = temp_table.stock WHERE items.barcode = temp_table.barcode AND items.departmentid = temp_table.departmentid. 有什么方法可以让这更快?
【问题讨论】:
-
您是否对其进行了分析以查看哪个方面需要时间?确定是
executeUpdate()吗?如果是这样,你的表上有索引吗? (顺便说一句,根据这些数字,每次录制需要 0.05 秒,这还不错)。
标签: java mysql performance csv jdbc