所以我试着获得大约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();
当我制作 - &gt; 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创建每个记录的新对象是任何事实如何加快这个?
答案 0 :(得分:1)
您可以通过将更多代码重写为原始查询或将整个查询重写为原始SQL来尝试优化代码。就像你提到的那样,Laravel必须创建数千个对象,这确实会减慢你正在经历的过程。
请查看Laravel文档中的Raw Expressions以了解更多相关信息。
docs的基本示例:
$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。
答案 1 :(得分:0)
它在phpMyAdmin中很快,因为它返回分页结果,而不是像你指出的那样创建任何php对象。
不使用get()对分页结果使用paginate()或使用pluck()获取具有单个字段的所有记录,例如pluck(&#39; name&#39;,&#39; id&#39;),它将返回一个由id键入的关联数组。