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 万条记录,我觉得这应该快得多,因为它是一个简单的查询,我错过了吗我的查询或获取数据的方式有问题吗?
一些建议
索引 'created_at' 列并删除其他索引(如果不需要)。
使用 simplePaginate() - https://laravel.com/docs/8.x/pagination#simple-pagination
如果您正在使用 laravel 8,请尝试光标分页 - https://laravel.com/docs/8.x/pagination#cursor-pagination
我有一个 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 万条记录,我觉得这应该快得多,因为它是一个简单的查询,我错过了吗我的查询或获取数据的方式有问题吗?
一些建议
索引 'created_at' 列并删除其他索引(如果不需要)。
使用 simplePaginate() - https://laravel.com/docs/8.x/pagination#simple-pagination
如果您正在使用 laravel 8,请尝试光标分页 - https://laravel.com/docs/8.x/pagination#cursor-pagination