如何解决为什么这些简单的 Laravel 查询这么慢?
应用程序运行良好,突然间我开始收到超时错误。 原始代码不是我的,当这个问题开始出现时,我被迫优化应用程序。
我尝试过的修复:
- 在中间件中缓存“当前模板”、“模板选项”和“设置”数据库数据。这大大提高了速度,因为每个数据库行都是使用自己的查询获取的(所以说我们有 18 个模板选项 = 18 个数据库查询)
- 删除我所做的任何更改。效果不佳,这意味着问题出在其他地方。
- 使用旧的 Windows 在线安装程序升级我的本地 MySQL 服务器。
- 删除“公司”全局范围,这让我 100% 确定范围与它无关。
- 在 MySQL 控制台中运行 MySQL 查询,速度很快。
公司中间件:负责缓存数据库数据
public function handle($request,Closure $next)
{
if (!isset($GLOBALS['CURRENT_TEMPLATE']) || !($GLOBALS['CURRENT_TEMPLATE'] ?? null) instanceof \App\Template) {
$GLOBALS['CURRENT_TEMPLATE'] = \App\Template::where('enabled',1)->first();;
}
if (!isset($GLOBALS['SETTINGS']) || !($GLOBALS['SETTINGS'] ?? null) instanceof Collection) {
$GLOBALS['SETTINGS'] = \App\Setting::all(); // Changed this just now in code,it had a copy&paste typo,but no impact at all (used to be \App\Template::all())
}
if (!isset($GLOBALS['TEMPLATE_OPTIONS']) || !($GLOBALS['TEMPLATE_OPTIONS'] ?? null) instanceof Collection) {
$GLOBALS['TEMPLATE_OPTIONS'] = $GLOBALS['CURRENT_TEMPLATE']->templateOptions()->get();
}
if (!isset($GLOBALS['HEADER_MENU']) || !($GLOBALS['HEADER_MENU'] ?? null) instanceof Collection) {
$GLOBALS['HEADER_MENU'] = \App\HeaderMenu::all();
}
if (!isset($GLOBALS['FOOTER_MENU']) || !($GLOBALS['FOOTER_MENU'] ?? null) instanceof Collection) {
$GLOBALS['FOOTER_MENU'] = \App\FooterMenu::all();
}
if(class_exists('\App\Helper') && method_exists(new \App\Helper(),'boot')){
\App\Helper::boot();
}
return $next($request);
}
我相信问题在查询中的某个地方持续存在,但我不确定在哪里。我尝试使用 XDebug 进行调试,查看 Laravel Debugbar 和 Clockwork 日志,最后查看 Laravel Telescope。
PS:我在此屏幕截图中添加了每个查询的行数。
我目前仍在优化代码,但正如您已经看到的,即使删除重复查询也不是解决方案,因为无论如何查询都花费太长时间。
如果您对我应该调试此问题的其他方法有任何建议,或者如果您有解决方案,请告诉我更好。请随时询问您可能需要的更多详细信息。谢谢!
更新
优化查询并去除重复后,结果还是一样。查询超过 16000 毫秒
解决方法
看起来您需要一些索引。
INDEX(company_id,enabled)
INDEX(template_id)
INDEX(slug)
当使用 LIMIT
而没有 ORDER BY
时,您得到的行是不可预测的。
(请使用文本而不是图像来显示代码。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。