我们有一个 Laravel 应用程序(版本 5.4.18)连接到 MySQL(5.6.38)数据库(总共 30 万行),MyISAM 类型。
而且我们有像Model::with('anothermodel')->paginate(25)
这样的api-response,在某个时候这个查询的执行时间已经达到了18秒,这是非常大的值(value).我创建了一个沙箱,其中包含实时 laravel 环境的副本,该环境使用完全相同的数据库(在同一台服务器上)的副本,现在这个 api 响应在 2.5 秒内执行。如果我们尝试将沙箱 laravel 连接到实时数据库,那么 api 执行又是 18 秒。请检查图像。
因此,如果我们假设问题出在实时网站的数据库表中,但如果我们尝试使用 microtime
测量此查询,那么它会显示生成此查询所需的时间并抓取从数据库中获取数据仅需 0.7 秒。
因此,如果我们假设问题出在 API 路由或 Laravel 代码中,但如果我只是将其复制到子目录(作为沙箱)中,则可以毫无问题地执行完全相同的代码。
有什么想法吗?
还有一些服务器信息:Linux 服务器上的 PHP 7.0.29,内存为 32gb。
最佳答案
我有 3 个解决方案:
1) 使用此命令检查、优化和修复表:
mysqlcheck -u root -p --auto-repair --check --optimize --all-databases
2) 如果问题未解决,请使用 Newrelic 等监控应用程序检查您的查询执行计划
3) 有时这与特定表无关,而是与数据库损坏有关,请尝试删除并使用旧数据创建一个新表。 How to recover/recreate mysql's default 'mysql' database
关于mysql - 在一个数据库上查询速度慢,但在他的副本上查询速度快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50727483/