php - 我怎样才能使涉及大约 300,000 行的更新语句更快?

标签 php mysql sql ubuntu optimization

我有一个 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/

相关文章:

mysql - 未调用存储过程 SQLWARNING 退出处理程序

sql - 我的 SQL 查询需要多长时间?

mysql - 格式化Sql查询数字以返回给定格式的数字

php - 按元数据显示 WordPress 自定义帖子

php - Codeigniter URL 和 base_url() 混淆

php - 使用 PHP Selenium Webdriver 单击下拉菜单中的选项?

mysql - 授予对子网上所有机器的 mysql 访问权限

php - where 子句在 codeigniter 中不起作用

Java Servlet Mysql Blob 图像

if/elseif/else 的 PHP 语法,但有 4 个条件