【发布时间】:2019-08-24 12:12:15
【问题描述】:
我有一个 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 秒。 有没有办法让这个过程更快?我应该增加内存吗?
【问题讨论】:
-
请注意,使用
take而不使用orderBy没有多大意义,因为不清楚要获取哪些 300K 记录。对于关于优化更新的问题,您可能需要添加一些索引才能实现。 -
这个计算也会影响你的表现
->where(DB::raw('CHAR_LENGTH(sign)'), '=', 7),因为它不是真正值得索引的。即使status已编入索引,索引也只能帮助您处理不同的数据。越是不同的索引越好。使用此 WHERE 子句的 SELECT(带有SQL_NO_CACHE)需要多长时间, -
@TimBiegeleisen 在这种情况下获取哪个 300K 并不重要,这就是为什么不使用 orderBy。 char_length=7 和 status=0 的任何 300K 都可以使用。
-
@ArtisticPhoenix 你能告诉我你所说的 SQL_NO_CACHE 是什么意思吗?选择查询不需要很长时间,不到一秒。
-
您只需像这样添加它
SELECT SQL_NO_CACHE id, foo FROM它只是告诉数据库不要从缓存中获取结果。更好地了解 SELECT 的速度。见stackoverflow.com/questions/18777975/when-to-use-sql-no-cache
标签: php mysql sql ubuntu optimization