Laravel 查询从数据库中获取数据很慢

Laravel query slow to fetch data from database

我有一个 Laravel API 和一个用 Nuxt JS 构建的前端。在我的一个前端页面上,我显示了来自我的一个数据库 table 的应用程序 (客户数据) 的分页列表,这是对我的请求端点和函数 applications 以分页列表的形式从数据库中获取数据。

但问题是,考虑到我对数据的处理不多,而且我的数据库 table 没有那么多列,感觉速度很慢。

我的应用程序 table 的架构是:

Schema::create('applications', function (Blueprint $table) {
    $table->id();
    $table->string('hash', 42)->index();
    $table->string('product_type')->nullable();
    $table->string('email')->nullable()->index();
    $table->date('birthday')->nullable()->index();
    $table->string('postcode')->nullable()->index();
    $table->string('mobile')->nullable()->index();
    $table->text('data');
    $table->timestamps();
    $table->timestamp('verified_at')->nullable();
});

有问题的功能是:

/**
 * Applications
 */
public function getApplications()
{

    $applications = Application::orderBy('created_at', 'desc')
                               ->paginate(25);

    foreach ($applications as $key => $applicant) {
      try {
        $applications[$key]['data'] = json_decode($applicant['data']);
      } catch (\Exception $e) { }
    }

    return $applications;

}

/**
 * All applications
 *
 * @param  Request  $request
 */
public function applications(Request $request)
{

    try {

      // daily graphs
      $applications = $this->getApplications();

      // not set or nothing to report
      if (!$applications) {
        return response()->json([
          'success' => false,
          'msg' => 'No applications found, check back in a few minutes',
        ], 422);
      }

      // return the response
      return response()->json([
        'success' => true,
        'msg' => 'Icicle applications',
        'applications' => $applications ?? null
      ], 200);

    } catch (\Exception $e) {

      // return default template
      return response()->json([
        'success' => false,
        'msg' => 'We were unable to load applications right now',
      ], 422);

    }

}

我已经尝试将 paginate 更改为简单的 get 并且我还尝试 运行 通过 Tinker 进行相同的查询,我进一步尝试完全删除我的 foreach 循环查看是否提高了性能。

获取数据需要 7 秒,其中我有 200 万条记录,我觉得这应该快得多,因为它是一个简单的查询,我错过了吗我的查询或获取数据的方式有问题吗?

一些建议

  1. 索引 'created_at' 列并删除其他索引(如果不需要)。

  2. 使用 simplePaginate() - https://laravel.com/docs/8.x/pagination#simple-pagination

  3. 如果您正在使用 laravel 8,请尝试光标分页 - https://laravel.com/docs/8.x/pagination#cursor-pagination