所以我尝试获取大约 5k 条记录,你编写了以下代码:
$mainData = DB::table('table')
->where('id', $id)
->where('status', '>', 0)
->where('amount', '>', 0)
->orderBy('timestamp', 'DESC')
->where('status', '>=', DB::raw('UNIX_TIMESTAMP((LAST_DAY(DATE_SUB(NOW(), INTERVAL ' . intval($month) . ' MONTH))+INTERVAL 1 DAY)-INTERVAL 1 MONTH)'))
->where('status', '<', DB::raw('UNIX_TIMESTAMP(LAST_DAY(DATE_SUB(NOW(), INTERVAL ' . intval($month) . ' MONTH))+INTERVAL 1 DAY)'))
->get();
当我创建 ->toSql() 时,我得到了这个查询:
select * from `table` where `id` = 3 and `status` > 0 and `amount` > 0 and `status` >= UNIX_TIMESTAMP((LAST_DAY(DATE_SUB(NOW(), INTERVAL 2 MONTH))+INTERVAL 1 DAY)-INTERVAL 1 MONTH) and `status` < UNIX_TIMESTAMP(LAST_DAY(DATE_SUB(NOW(), INTERVAL 2 MONTH))+INTERVAL 1 DAY) order by `timestamp` desc
当我在 phpmyadmin 中执行此查询时: 显示第 0 - 24 行(总共 5980 行,查询花费了 0.0513 秒。)但是当我在 laravel 中运行此查询时,它花费了大约 6 秒(仅 6k 记录)我认为问题可能是 laravel 每条记录创建新对象是任何有什么办法可以加快速度?
最佳答案
您可以尝试通过将更多代码重写为原始查询或将整个查询重写为原始 SQL 来优化代码。正如您所提到的,Laravel 必须创建数千个对象,这确实减慢了您所经历的过程。
看看Raw Expressions在 Laravel 文档上阅读有关此内容的更多信息。
文档中的基本示例:
$users = DB::table('users')
->select(DB::raw('count(*) as user_count, status'))
->where('status', '<>', 1)
->groupBy('status')
->get();
也许还可以通过向 ->get()
提供字段数组来减少返回的数据量。 。您可以在 Laravel Eloquent Builder API Documentation 上查看执行此操作的 API。 .
关于php - Laravel DB get() 很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46309996/