【问题标题】:Performance differences between DEV and Production environment MYSQL serverDEV和生产环境MYSQL服务器的性能差异
【发布时间】:2019-04-22 14:19:14
【问题描述】:

我正在使用 Laravel 5.6 和 VueJS 构建一个应用程序,从 Laravel 后端的 API 请求数据。在我的 DEV 环境中,查询根本不需要时间,但在生产环境中,API 上的响应需要 85.7 秒,而在 DEV 环境中则需要 0.1 秒。两种环境中的数据相同。

使用控制器中的以下命令,我能够获得运行的确切查询,并且可以一一测试它们:

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 个条目的照片。如果您在表结构方面需要更多详细信息,请在 cmets 部分投票之前告诉我 :-)

在生产服务器上,许多其他应用程序使用 Laravel 或 Wordpress 在相同的 MySQL 安装上使用数据库运行,它们都没有类似的问题。

【问题讨论】:

  • 开发和生产数据库不同?如果是,请确保生产中也存在索引。
  • 都是一样的,除了id作为主键定义在两个表上没有索引。
  • 可能是您的生产服务器数据库引擎配置远低于您的开发环境。尝试联系您的托管服务提供商。
  • 它在 VPS 上...所以我应该是我的 MySQL 服务器的主人
  • 我刚刚在photos.eventID 列上添加了一个索引,这似乎可以解决问题。现在像火箭一样快...:API 响应 0.4 秒

标签: mysql laravel-5 phpmyadmin eloquent


【解决方案1】:

虽然前两个查询输出不多,但它们必须处理最多的数据,因此似乎是内存和/或 CPU 密集型查询。

我的 DEV 环境似乎比我的生产环境更强大,因此我有这么大的差异。

最后的解决方案很简单:我在 photos.eventID 列中添加了一个 INDEX 类型的 INDEX,这无论如何都是个好主意。

这个小改动让我的 API 在 0.4 秒内而不是 85.7 秒内响应

【讨论】:

  • 提示未来,在 DEV 和 PROD 上的 EXPLAIN 将清楚地识别 PROD 上缺少的索引。
  • 谢谢,我只需要弄清楚如何使用该命令 :-)
  • @kevinkrause 在 Google 中搜索“mysql 解释教程”进行初步研究你会发现它真的很简单,在你的 SELECT xxxxx 之前加上 EXPLAIN - 试一试,学习如何解释结果,你会很惊讶。
  • 谢谢,但很抱歉我不再使用谷歌了...我无法绕过 dev.mysql.com/doc/refman/8.0/en/explain.html 上的文档,这就是我要求快速指针的原因....跨度>
  • google 的替代品包括 bing.com 或 yahoo.com - 无论您在网络上搜索什么都可以。这是我所知道的最快的指针。你试过我的建议了吗? EXPLAIN before SELECT .....供您介绍。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-28
  • 2012-06-04
  • 2022-01-16
  • 2015-10-07
  • 2019-11-10
  • 1970-01-01
相关资源
最近更新 更多