我有一个非常奇怪的问题,我无法解决问题。 我正在将Laravel用于后端应用程序,在该应用程序上,我对具有30k条记录并带有正确索引的表运行非常简单的查询。 这是查询:
DB::select('select * from Orders where ClientId = ?', [$id])
在Laravel应用程序中,此查询运行1.2秒(如果我使用Eloquent模型,这也是一样):
"query" => "select * from Orders where ClientId = ?"
"bindings" => array:1 [▼
0 => "44087"
]
"time" => 1015.2
问题是,如果我在数据库控制台或PHPMyAdmin中运行THE SAME查询,则该查询大约需要20毫秒。
由于我使用的是相同的数据库,相同的查询,同一台计算机以及与该数据库的相同连接,所以我不知道这怎么可能。
可能是什么原因?
答案 0 :(得分:2)
PHPMyAdmin将自动为您添加LIMIT
。
这是因为默认情况下,PHPMyAdmin将始终对您的查询进行分页。
在Laravel / Eloquent查询中,您一次加载了所有3万条记录。必须花时间。
要解决此问题,请尝试pagination或chunking您的查询。
总计将花费很长时间,是的,但是大块本身将很快。
答案 1 :(得分:0)
我将尝试使用“调试栏”调试查询,以了解它花费了多少时间,并且花费了更长的时间,...使用和安装非常简单:https://github.com/barryvdh/laravel-debugbar 我认为您对数据库管理感兴趣。.也请阅读此书,您会发现一些想法。祝您好运
答案 2 :(得分:0)
我几乎可以肯定这是由于PHPMyAdmin的使用限制所致,与您在页面输出中看到的内容有关。
如果您看到PHPMyAdmin页面的顶部,则会看到以下内容:
显示第0-24行(共314行,查询耗时0.0009秒。)
将限制添加到查询中时,您应该具有相同的性能。
答案 3 :(得分:0)
答案 4 :(得分:0)
这里有几个问题。第一个是laravel如何工作。 Laravel仅加载在脚本中执行的服务和类。这样做是为了节省资源,因为PHP应该作为CGI脚本而不是长时间运行的进程来运行。因此,您的时间安排可能包括连接设置步骤,而不仅仅是执行查询。为了获得更“可靠”的结果,请在计时简单查询之前执行任何查询。
这种行为还有另一面。在长时间运行的过程中,例如JobRunner,您不应更改服务参数。这可能会导致不良行为,并导致参数更改溢出到其他作业中。例如,如果您提供SMTP登录功能,则应在发送电子邮件后重置电子邮件发件人凭据,否则您将遇到一个问题,即不使用该功能的用户会像发送另一个电子邮件的用户那样发送电子邮件。这是因为每次执行作业时都会重新加载服务,这是运行HTTP部件时的行为。
第二,您没有使用限制。正如其他一些海报指出的那样。
答案 5 :(得分:0)
在phpmyadmin中查询应该具有相同的速度,否则应用程序将尝试使用explain语句来查看有关查询的更多详细信息
此冲突的原因可能是由于MySQL以外的许多原因造成的,例如
php脚本本身具有一些导致加载缓慢的功能 尝试检查服务器error.log也许函数存在错误
基本上,phpmyadmin可能与MySQL连接功能中的幼虫不同,请尝试检查连接中使用的扩展名,也许与您使用的php版本不兼容,我认为这是查询缓慢的原因
我注意到,在我制作的某些应用程序中,原因总是在php函数或连接中,例如mysql_connect比我在php <5.6上扩展的PDO快得多,但原因始终来自于脚本