php - 如何使用 laravel 处理 mysql 中的大型更新查询

标签 php mysql laravel file

有没有一种方法可以在查询中更新 100k 条记录,并且 mysql 数据库可以顺​​利运行?

假设有一个表 users 包含十万条记录,我必须更新大约五万条记录,为了更新,我有这些记录的 ID 意味着大约有五万条记录存储在 csv 文件中,

1 - 查询是否正常,因为查询的大小会太大吗?或者如果有任何方法可以放入更小的 block ,请告诉我?

2- 考虑到 laravel 框架,如果有任何选项可以读取文件的一部分而不是整个文件,以避免内存泄漏,因为我不想同时读取所有文件,请建议。

欢迎提出任何建议!

最佳答案

如果您正在考虑构建类似 UPDATE users SET column = 'value' WHERE id = 1 OR id = 2 OR id = 3 ... OR id = 50000 的查询或 WHERE id IN (1, 2, 3, ..., 50000)那可能太大了。如果你能做一些逻辑来总结,它会缩短查询并显着加快 MySQL 端的速度。也许你可以做到 WHERE id >= 1 AND id <= 50000 .

如果那不是一个选项,您可以分批进行。您可能要遍历 CSV 文件的行,将查询构建为一个很大的 WHERE id = 1 OR id = 2...查询,每 100 行左右(如果仍然太大,则为 50 行),运行查询并为接下来的 50 个 ID 启动一个新查询。

或者您可以只运行 50.000 个单次 UPDATE查询您的数据库。老实说,如果表正确使用索引,在大多数现代网络服务器上运行 50.000 个查询应该只需要几秒钟。即使是最繁忙的服务器也应该能够在一分钟内处理好。

至于分块读取文件,您可以使用 PHP 的基本文件访问函数:

$file = fopen('/path/to/file.csv', 'r');

// read one line at a time from the file (fgets reads up to the
// next newline character if you don't provide a number of bytes)
while (!feof($file)) {
    $line = fgets($file);

    // or, since it's a CSV file:
    $row = fgetcsv($file);
    // $row is not an array with all the CSV columns

    // do stuff with the line/row
}

// set the file pointer to 60 kb into the file
fseek($file, 60*1024);

// close the file
fclose($file);

这不会将整个文件读入内存。不确定 Laravel 是否有自己的文件处理方式,但这是在基本 PHP 中的处理方式。

关于php - 如何使用 laravel 处理 mysql 中的大型更新查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43878260/

相关文章:

php - 将http请求重定向到mailto请求

php - 比较2个时间戳并根据结果设置语句

php - 如何将 Laravel rest Api 日志保存到数据库中

php - 我的 php/mysql 代码有什么问题?

javascript - Tizen 上的 VueJS 和 Laravel 5.4 不起作用

php - 无法在 view.Laravel 中获取值

php - 检查表中是否存在记录,如果存在则重定向

php - Laravel league/flysystem 使用 AWS S3 获取文件 URL

mysql - 问卷解密数据库ER图

mysql - 在 Perl 中跟踪不确定的 MySQL 错误