如何有效地更新多行?
- 一份声明
- 多个语句
单个语句字符串是否会变得太大而 SQL 无法处理(超过 10000 个条目/行)?
我有一个要修改的变量,即status
:
| id | status |
我的数据存储在一个列表(ArrayList)中。
在 MySQL中使用Load Data命令可能更有效。前提是您可以将输入结构化为 CSV 格式。适当地使用 REPLACE 和/或 IGNORE 关键字。这将比对 MySQL 的 1000 条单独语句快得多。
如果您想使用 JDBC 并使其高效,您绝对应该查看这篇关于批量插入性能的博客文章(也适用于更新)。
一般来说,您需要添加rewriteBatchedStatements=true
到您的连接字符串,例如:
Connection con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/database_name?rewriteBatchedStatements=true","login", "password");
这将允许驱动程序获取准备好的语句并将它们重新编写为更有效的形式。
请参阅准备好的语句:http ://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html
在循环外创建准备好的语句,然后在循环内,只需使用更新的参数执行准备好的语句。
如果您的状态是一组有限的值,那么我将根据状态将列表分解为子集,然后更新每个语句的行集。即使特定状态有 10K 行,您也可以在单个调用中更新多行(使用 in 运算符)。这将减少您的应用程序需要进行更新的往返。
您也可以尝试这样的批量更新,但我不确定它们是否有效:
update `id_status_table` `row`
set `status` = (
select case `row`.`id` when 1 then 'one'
when 2 then 'two'
else 'three or more' end
);
虽然 10000 行的查询字符串可能会变得太大,但您可以将此类查询应用于每 1000 行。