我正在使用Laravel 5.6和VueJS构建一个应用程序,以从Laravel后端的API请求数据。在我的DEV环境中,查询根本不花时间,但是在生产环境中,API上的响应需要85.7秒,而在DEV环境中则为0.1秒。两种环境中的数据都相同。
使用我的Controller中的以下命令,我可以获得运行的确切查询,并且可以对它们进行逐一测试:
DB::enableQueryLog();
// then my eloquent stuff
$query = Sportevent::whereHas('photos')->with('photos');
if($request->input('year')){
$year = $request->input('year');
$query = $query->where('date','like', $year.'%');
}
if($request->input('country')){
$country = $request->input('country');
$query = $query->where('country',$country);
}
$sportevents = $query->orderBy('date',"DESC")->paginate(10);
// then I display the queries:
dd(DB::getQueryLog());
以下是未选择年份或国家/地区而产生的查询,包括两种环境中随时间变化的表现:
// --------------------------------------------------------------
// DEV: 0.0208 seconds | PROD: 73 seconds (had to use stopwatch)
// --------------------------------------------------------------
select count(*) as aggregate from `events` where exists
(select * from `photos` where `events`.`id` = `photos`.`eventID`
and `active` = 1)
// ------------------------------------------
// DEV: 0.025 seconds | PROD: 38.9721 seconds
// ------------------------------------------
select * from `events` where exists (select * from `photos` where
`events`.`id` = `photos`.`eventID` and `active` = 1)
order by `date` desc limit 10 offset 0
// ------------------------------------------
// DEV: 0.0112 seconds | PROD: 0.0141 seconds
// ------------------------------------------
select * from `photos` where `active` = 1 and `photos`.`eventID` in
(11194, 11087, 10506, 10797, 9910, 10118, 10212, 9655, 10047, 10049)
表事件包含约6000个条目和少于50000个条目的照片。如果您需要有关表结构的更多详细信息,请在评论部分进行投票之前让我知道:-)
在生产服务器上,还有许多其他的应用程序与Laravel或Wordpress一起运行,并且使用同一MySQL安装上的数据库,但它们都没有类似的问题。
答案 0 :(得分:0)
尽管前两个查询输出不多,但它们必须处理最多的数据,因此似乎是占用大量内存和/或CPU的查询。
看来我的DEV环境比生产环境具有更多的功能,因此,我有很大的不同。
最后的解决方案很简单:我在列photos.eventID
中添加了INDEX类型的INDEX,无论如何这都是个好主意。
这个小小的变化使我的API在0.4秒内响应,而不是85.7