代码之家  ›  专栏  ›  技术社区  ›  Ankit

Laravel API的mysql查询未在performance\u模式中得到跟踪。events\u statements\u summary\u by\u digest

  •  10
  • Ankit  · 技术社区  · 6 年前

    我在这里面临着一些非常奇怪的问题。我们有一个托管在AWS EC2上的laravel API,我们使用RDS(mysql 5.6)。我最近在RDS上启用了performance\u架构。以下是我注意到的行为

    1. 我们的RDS实例上有两个数据库。一个用于wordpress,一个用于我们的laravel API。Wordpress数据库查询得到了很好的理解。但从我们的laravel应用程序运行的查询并非如此。
    2. 出于某种原因,当我将MySql Workbench连接到RDS实例并在我们的Laravel数据库上执行查询时,它们会很好地出现在语句摘要中。
    3. 我登录到我的EC2机器,在RDS上连接到MySQL并执行一些查询,它们在语句摘要中得到跟踪。

    因此,看起来只有在从我们的Laravel应用程序执行查询时,才会被跟踪。

    我们的Laravel版本是4.2。我正在努力找出过去两天的原因,任何帮助都将是一种解脱。

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

    --编辑--

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

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

    它出现在查询分析中[ https://prnt.sc/j3ochd] (我还手动检查了performance\u schema.events\u statements\u summary\u by\u digest)

    但接下来我可以点击我们的laravel api,它实际上从交易表本身返回条目(非常像我上面运行的查询)。但这会出现在我的查询分析报告(Percona PMM)或events\u statements\u summary\u by\u digest中

    1 回复  |  直到 6 年前
        1
  •  9
  •   Community Dai    4 年前

    你必须通过 options 数据库中的参数>连接设置为 PDO::ATTR_EMULATE_PREPARES => true

    配置(>);数据库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\u EMULATE\u PREPARES 启用或禁用已准备语句的模拟。一些驱动程序不支持本机准备的语句,或者对它们的支持有限。使用此设置可以强制PDO始终模拟准备好的语句(如果驱动程序支持TRUE和模拟的准备),或者尝试使用本机准备好的语句(如果FALSE)。如果驱动程序无法成功准备当前查询,它将始终返回到模拟准备好的语句。