有没有一种方法可以在查询中更新 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/