Laravel API的mysql查询未在performance_schema.events_statements_summary_by_digest中被跟踪

时间:2018-04-08 04:20:59

标签: mysql laravel laravel-4 amazon-rds database-performance

我在这里遇到一些非常奇怪的问题。我们在AWS EC2上托管了一个laravel API,我们使用RDS(mysql 5.6)。我最近在RDS上启用了performance_schema。以下是我注意到的行为

  1. 我们的RDS实例上有两个数据库。一个用于wordpress,一个用于我们的laravel API。 Wordpress数据库查询正在逐渐消化。但是从我们的laravel应用程序运行的查询不是。
  2. 出于某种原因,当我将MySql Workbench连接到RDS实例并在我们的Laravel数据库上执行查询时,它们会在语句摘要中出现。
  3. 我登录了我的EC2机器,在RDS上连接到MySQL并执行了一些查询,并在语句摘要中跟踪它们。
  4. 所以看起来只有在我们的Laravel应用程序执行查询时,它们才会被跟踪。

    我们的Laravel版本是4.2。我试图找出最近两天的原因,任何帮助都将是一种解脱。

    我在上述所有步骤中使用的用户都是相同的,并拥有所有数据库的所有权限。

    - 编辑 -

    我进行了许多其他测试,他们都只指出了一个与Laravel有关的结论。我在托管laravel的同一台服务器上创建了一个简单的php文件。在此文件中,我使用相同的用户/密码连接到相同的实例/数据库。我在这个文件中所做的只是在$ pdo上运行一个非常简单的查询。

    $stmt = $pdo->query('SELECT name FROM trades');
            while ($row = $stmt->fetch())
            {
                echo $row['name'] . "\n";
            }
    

    它出现在查询分析[https://prnt.sc/j3ochd]中(我手动检查了performance_schema.events_statements_summary_by_digest)

    然后我可以点击我们的laravel api,它实际上返回了交易表本身的条目(非常类似于我上面运行的查询)。但这会出现在我的查询分析报告(Percona PMM)或events_statements_summary_by_digest

1 个答案:

答案 0 :(得分:11)

您必须在数据库>中传递options参数连接设置为PDO::ATTR_EMULATE_PREPARES => true

config> database.php中

'connections' => [

    'mysql' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'unix_socket' => env('DB_SOCKET', ''),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'strict' => false,
        'engine' => null,
        'options' => [
            PDO::ATTR_EMULATE_PREPARES => true
        ]
    ],

默认情况下,laravel将此选项标记为PDO::ATTR_EMULATE_PREPARES => false以提高查询效果。

以下是快速详细信息。

PDO :: ATTR_EMULATE_PREPARES 启用或禁用预准备语句的模拟。某些驱动程序不支持本机预处理语句或对它们的支持有限。使用此设置可强制PDO始终模拟预准备语句(如果驱动程序支持TRUE和模拟准备),或尝试使用本机预准备语句(如果为FALSE)。如果驱动程序无法成功准备当前查询,它将始终回退到模拟预准备语句。