我有一个 Laravel 应用程序,它有一个常见的操作,用户从一个名为 Sign 的数据库表中获取大约 300,000 行,其中包含 3 列。表列说明如下:id(int-10), sign(varchar-16), status(int-10)
该表有大约 3 亿个条目。当用户获取一些条目时,这些行的状态列将更改为用户的 ID。请注意,用户每次总是输入大约 300,000 个条目。
我已将 innodb_buffer_pool_size 和 innodb_log_file_size 分别增加到 2GB 和 1GB。系统有 3.75GB 的 RAM。
这是代码-
$collection = Sign::select('sign')
->where('status', 0)
->where(DB::raw('CHAR_LENGTH(sign)'), '=', 7)
->take(300000);
//write the the signs in $collection in a file here
$collection->update(['status' => $user->id]);
在我的案例中,表格数据可以在不到 1 秒的时间内轻松获取。更新语句以前需要大约 100-200 秒,但最近我将我的操作系统从 Ubuntu 14 升级到 16,在此更新语句之后大约需要 500-600 秒。 有什么办法可以使这个过程更快?我应该增加 RAM 吗?
最佳答案
您不必像在 laravel eloquent 中那样直接点击更新查询,而不是选择和更新,
$collection = Sign::where('status', 0)
->whereRaw('CHAR_LENGTH(sign) = 7')
->update(['status' => $user->id]);
在任何数据库中,选择操作总是很快的,因为它只涉及表的扫描,你可能会得到更多的细节,例如EXPLAIN SELECT * FROM sign;
关于php - 我怎样才能使涉及大约 300,000 行的更新语句更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55487123/