mysql - 如何快速更新多行(1 500 000)

标签 mysql sql-update load-data-infile

我的表有 150 万行,并且有 47k 个值需要更新。 我尝试了两种方法,但都很慢。

首先是 47k 行

UPDATE $table 
SET name = '$name' 
WHERE id = '$id'

第二个是

$prefix = "UPDATE table
    SET name = (case ";
while () {
    $mid .=  "when id = '$id' then '$name' ";   
}
$suffix = "end);";

$query = $prefix . $mid . $suffix;

有没有办法可以更快地做到这一点?也许使用LOAD DATA INFILE?无法弄清楚这个 UPDATE 语法。

最佳答案

我每天都必须导入大文件,并尝试了各种方法。

最终我获得了以下特定组合的最佳性能:

  1. 首先将 CSV 复制到数据库服务器,然后从本地磁盘加载它,而不是从客户端计算机加载 CSV。
  2. 确保您有一个与此完全匹配的表结构。我使用临时表进行导入,然后使用单独的查询将数据导入最终表。
  3. tmp 表上没有外键和唯一索引检查。
  4. 这已经可以加快速度了。如果您需要压缩更多性能,可以增加日志缓冲区大小。

显然:

  • 确保您不导入不需要的内容。对于包含哪些字段以及哪些行,请务必谨慎。
  • 如果列中只有几个不同的文本值,请改用数值。
  • 您的 float 真的需要 8 位小数吗?
  • 您是否重复导入相同的数据,而只能插入更新?
  • 确保导入期间不会触发不必要的类型转换。准备数据,使其尽可能接近您要导入的表。

关于mysql - 如何快速更新多行(1 500 000),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53453230/

相关文章:

java - 参数索引超出范围 (0 < 1)

MYSQL - 将日期从 2020 年更改为 2011 年

mysql - 如果满足条件则更新表。 (将b表的值更新为a)需要对应的值

mysql - LOAD DATA INFILE 跳过记录

php - 从 mysql 数据的下拉列表中预选值

mysql - 使用正则表达式将一列拆分为多列

mysql - 更新时触发

python - 如何以 dd-mm-yyyy hh :mm:ss in an oracle table through python 格式更新当前日期、时间

MySQL 错误 "' WITH' 在此位置对于需要 ALTER、ANALYZE 的服务器版本无效...”