如何快速更新多行(1 500 000)
How to UPDATE many rows(1 500 000) fast
我 table 有 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
?无法弄清楚这个的更新语法。
我不得不每天导入大文件,并尝试了各种方法。
最终我得到了最佳性能的特定组合:
- 首先将 CSV 复制到数据库服务器,然后从那里的本地磁盘加载它,而不是从您的客户端计算机加载 CSV。
- 确保您的 table 结构与此完全匹配。我使用临时 table 进行导入,然后使用单独的查询将数据导入最终的 table.
- tmp 上没有外键和唯一索引检查 table。
- 这已经大大加快了速度。如果需要压缩更多性能,可以增加日志缓冲区大小。
显然:
- 确保不要导入不需要的内容。对包含哪些字段和哪些行持批判态度。
- 如果您在一列中只有几个不同的文本值,请改用数值。
- 你的浮点数真的需要 8 位小数吗?
- 您是否重复导入相同的数据,而您只能在其中插入更新?
- 确保在导入过程中不会触发不必要的类型转换。准备您的数据,使其尽可能接近您要导入的 table。
我 table 有 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
?无法弄清楚这个的更新语法。
我不得不每天导入大文件,并尝试了各种方法。
最终我得到了最佳性能的特定组合:
- 首先将 CSV 复制到数据库服务器,然后从那里的本地磁盘加载它,而不是从您的客户端计算机加载 CSV。
- 确保您的 table 结构与此完全匹配。我使用临时 table 进行导入,然后使用单独的查询将数据导入最终的 table.
- tmp 上没有外键和唯一索引检查 table。
- 这已经大大加快了速度。如果需要压缩更多性能,可以增加日志缓冲区大小。
显然:
- 确保不要导入不需要的内容。对包含哪些字段和哪些行持批判态度。
- 如果您在一列中只有几个不同的文本值,请改用数值。
- 你的浮点数真的需要 8 位小数吗?
- 您是否重复导入相同的数据,而您只能在其中插入更新?
- 确保在导入过程中不会触发不必要的类型转换。准备您的数据,使其尽可能接近您要导入的 table。