Laravel DB get()很慢

时间:2017-09-19 21:26:28

标签: php mysql laravel

所以我试着获得大约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创建每个记录的新对象是任何事实如何加快这个?

2 个答案:

答案 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键入的关联数组。