使用 Query Insights 提高查询性能

本页面介绍了如何使用 Query Insights 信息中心检测和分析性能问题。

您可以使用 Gemini in Databases 协助功能来帮助您观察 Cloud SQL for MySQL 资源并排查问题。如需了解详情,请参阅在 Gemini 的协助下进行观察并排查问题

简介

Query Insights 可帮助您检测、诊断和阻止 Cloud SQL 数据库的查询性能问题。它支持直观监控并提供诊断信息,帮助您在检测范围之外确定性能问题的根本原因。

借助 Query Insights,您可以监控应用级层的性能,并按模型、视图、控制器、路由、用户和主机跟踪应用栈中有问题的查询的来源。Query Insights 工具可以使用开放式标准和 API 与现有的应用监控 (APM) 工具和 Google Cloud 服务集成。这样,您就可以使用常用工具监控和排查查询问题。

Query Insights 可以指导您完成以下步骤,帮助您提高 Cloud SQL 查询性能:

  1. 查看热门查询的数据库负载。
  2. 确定可能存在问题的查询或标记。
  3. 检查查询或标记以确定问题。
  4. 跟踪问题的根源。

所有 Cloud SQL 机器类型都支持 Query Insights,且所有 Google Cloud 区域都提供该功能。

Query Insights 适用于 MySQL 5.7 及更高版本。

价格

Query Insights 不会产生额外费用。您可以在 Query Insights 信息中心中访问一周的数据。

Query Insights 不会占用 Cloud SQL 实例存储空间中的任何存储空间。指标存储在 Cloud Monitoring 中。 如需了解 API 请求,请参阅 Cloud Monitoring 价格。Cloud Monitoring 可提供无需支付额外费用便可使用的层级。

准备工作

如需查看查询计划或执行端到端跟踪,您需要特定的 IAM 权限。创建自定义角色并向其中添加 cloudtrace.traces.get IAM 权限。然后,将此角色添加到需要使用 Query Insights 的每个用户账号。

如需查看查询计划及其端到端视图,您的 Google Cloud 项目必须启用 Trace API。此设置可让您的 Google Cloud 项目接收来自已经过身份验证的来源的跟踪记录数据,而无需额外付费。此数据可帮助您检测和诊断实例中的性能问题。

如需确认已启用 Trace API,请按照以下步骤操作:

  1. 在 Google Cloud 控制台中,转到 API 和服务

    转到“API 和服务”

  2. 点击启用 API 和服务
  3. 在搜索栏中,输入 Trace API
  4. 如果系统显示 API 已启用,则表示此 API 已启用,您无需执行任何操作。否则,请点击启用

启用 Query Insights

Query Insights 指标是经过静态加密的。有权访问 Cloud SQL 信息中心的用户可以在 Query Insights 信息中心中访问 Query Insights 指标。如果您有权更新实例,则可以配置 Query Insights。如需查看 Cloud SQL 实例所需的权限列表,请参阅 Cloud SQL 项目访问权限控制。 如果您没有这些权限,并且想要在实例上启用 Query Insights,请与您的管理员联系。

控制台

为实例启用 Query Insights
  1. 在 Google Cloud 控制台中,转到 Cloud SQL 实例页面。

    转到“Cloud SQL 实例”

  2. 如需打开实例的概览页面,请点击实例名称。
  3. 配置图块中,点击修改配置
  4. 配置选项部分中,展开查询数据分析
  5. 选中启用查询数据分析复选框。
  6. 可选:选择以下一个或多个 Query Insights 选项:
  7. 存储客户端 IP 地址

    默认值:false

    存储查询的来源客户端 IP 地址,并帮助您对相关数据进行分组,以便针对其运行指标。查询来自多个主机。查看来自客户端 IP 地址的查询的图表有助于识别问题的来源。

    存储应用标记

    默认值:false

    存储应用标记,以帮助您确定正在发出请求的 API 和模型视图控制器 (MVC) 路由,并对数据进行分组以对其运行指标。此选项要求您使用 sqlcommenter 开源对象关系映射 (ORM) 自动插桩库为查询添加一组特定标记注释。此信息有助于 Query Insights 确定问题的来源和问题所属的 MVC。应用路径可以帮助您进行应用监控。

    自定义查询长度

    默认值:1024

    将查询长度限制设置为 256 个字节到 4500 个字节范围内的指定值。更高的查询长度对于分析查询更有用,但也需要更多内存。更改查询长度需要重启实例。您仍然可以为超出长度上限的查询添加标记。

    设置最大采样率

    默认值:5

    设置最大采样率。采样率是系统每分钟在实例上的所有数据库中捕获的已执行查询计划样本的数量。将此值更改为从 0(如果选择此值,系统会停用采样)到 20 之间的数字。 提高采样率或许能为您带来更多数据点,但可能会增加性能开销。

  8. 点击保存
为多个实例启用 Query Insights
  1. 在 Google Cloud 控制台中,转到 Cloud SQL 实例页面。

    转到“Cloud SQL 实例”

  2. 点击任意行上的更多操作 菜单。
  3. 选择启用查询数据分析
  4. 在对话框中,选中为多个实例启用查询数据分析复选框。
  5. 点击启用
  6. 在随后出现的对话框中,选择您要为其启用 Query Insights 的实例。
  7. 点击启用查询数据分析

gcloud

要使用 gcloud 为 Cloud SQL 实例启用 Query Insights,请在将 INSTANCE_ID 替换为实例的 ID 后运行带有 --insights-config-query-insights-enabled 标志的 gcloud sql instances patch,如下所示。

gcloud sql instances patch INSTANCE_ID \
--insights-config-query-insights-enabled
  

此外,请使用以下一个或多个可选标志:

  • --insights-config-record-client-address

    存储查询的来源客户端 IP 地址,并帮助您对相关数据进行分组,以便针对其运行指标。查询来自多个主机。查看来自客户端 IP 地址的查询的图表有助于识别问题的来源。

  • --insights-config-record-application-tags

    存储应用标记,以帮助您确定正在发出请求的 API 和模型视图控制器 (MVC) 路由,并对数据进行分组以对其运行指标。此选项要求您使用一组特定标记对查询进行注释。为此,您可以使用 sqlcommenter 开源对象关系映射 (ORM) 自动插桩库。此信息有助于 Query Insights 识别问题的来源和问题所属的 MVC。应用路径可以帮助您进行应用监控。

  • --insights-config-query-string-length

    将默认查询长度限制设置为 256 到 4500 字节范围内的指定值。默认查询长度为 1024 字节。更高的查询长度对于分析查询更有用,但也需要更多内存。更改查询长度需要重启实例。您仍然可以为超出长度上限的查询添加标记。

  • --query_plans_per_minute

    默认情况下,实例上所有数据库每分钟最多执行 5 个查询计划样本。将此值更改为从 0(如果选择此值,系统会停用采样)到 20 之间的数字。 提高采样率或许能为您带来更多数据点,但可能会增加性能开销。

替换以下内容:

  • INSIGHTS_CONFIG_QUERY_STRING_LENGTH:要存储的查询字符串长度(以字节为单位)。
  • API_TIER_STRING:用于实例的自定义实例配置
  • REGION:实例的区域
gcloud sql instances patch INSTANCE_ID \
--insights-config-query-insights-enabled \
--insights-config-query-string-length=INSIGHTS_CONFIG_QUERY_STRING_LENGTH \
--query_plans_per_minute=QUERY_PLANS_PER_MINUTE \
--insights-config-record-application-tags \
--insights-config-record-client-address \
--tier=API_TIER_STRING \
--region=REGION
  

REST v1

如需使用 REST API 为 Cloud SQL 实例启用 Query Insights,请使用 insightsConfig 设置调用 instances.patch 方法。

在使用任何请求数据之前,请先进行以下替换:

  • project-id:项目 ID。
  • instance-id:实例 ID。

HTTP 方法和网址:

PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id

请求 JSON 正文:

{
  "settings" : { "insightsConfig" : { "queryInsightsEnabled" : true } }
}

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id",
  "status": "PENDING",
  "user": "user@example.com",
  "insertTime": "2021-01-28T22:43:40.009Z",
  "operationType": "UPDATE",
  "name": "operation-id",
  "targetId": "instance-id",
  "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/operations/operation-id",
  "targetProject": "project-id"
}

Terraform

如需使用 Terraform 为 Cloud SQL 实例启用 Query Insights,请将 query_insights_enabled 标志设置为 true。此外,您可以使用以下一个或多个可选标志:

  • query_string_length:默认值为 1024,您可以将其配置为 2564500 之间的值(以字节为单位)。
  • record_application_tags:如果要记录查询中的应用标记,请将值设置为 true
  • record_client_address:如果要记录客户端 IP 地址,请将值设置为 true
  • query_plans_per_minute:默认值为 5,您可以将其配置为 520 之间的值。
  • 示例如下:
    resource "google_sql_database_instance" "INSTANCE_NAME" {
     name                = "INSTANCE_NAME"
     database_version    = "MYSQL_VERSION"
     region              = "REGION"
     root_password       = "PASSWORD"
     deletion_protection = false # set to true to prevent destruction of the resource
     settings {
       tier = "DB_TIER"
       insights_config {
         query_insights_enabled  = true
         query_string_length     = 2048 # Optional
         record_application_tags = true # Optional
         record_client_address   = true # Optional
         query_plans_per_minute  = 10 # Optional
       }
     }
    }

    如需在 Google Cloud 项目中应用 Terraform 配置,请完成以下部分中的步骤。

    准备 Cloud Shell

    1. 启动 Cloud Shell
    2. 设置要在其中应用 Terraform 配置的默认 Google Cloud 项目。

      您只需为每个项目运行一次以下命令,即可在任何目录中运行它。

      export GOOGLE_CLOUD_PROJECT=PROJECT_ID

      如果您在 Terraform 配置文件中设置显式值,则环境变量会被替换。

    准备目录

    每个 Terraform 配置文件都必须有自己的目录(也称为“根模块”)。

    1. Cloud Shell 中,创建一个目录,并在该目录中创建一个新文件。文件名必须具有 .tf 扩展名,例如 main.tf。在本教程中,该文件称为 main.tf
      mkdir DIRECTORY && cd DIRECTORY && touch main.tf
    2. 如果您按照教程进行操作,可以在每个部分或步骤中复制示例代码。

      将示例代码复制到新创建的 main.tf 中。

      (可选)从 GitHub 中复制代码。如果端到端解决方案包含 Terraform 代码段,则建议这样做。

    3. 查看和修改要应用到您的环境的示例参数。
    4. 保存更改。
    5. 初始化 Terraform。您只需为每个目录执行一次此操作。
      terraform init

      (可选)如需使用最新的 Google 提供程序版本,请添加 -upgrade 选项:

      terraform init -upgrade

    应用更改

    1. 查看配置并验证 Terraform 将创建或更新的资源是否符合您的预期:
      terraform plan

      根据需要更正配置。

    2. 通过运行以下命令并在提示符处输入 yes 来应用 Terraform 配置:
      terraform apply

      等待 Terraform 显示“应用完成!”消息。

    3. 打开您的 Google Cloud 项目以查看结果。在 Google Cloud 控制台的界面中找到资源,以确保 Terraform 已创建或更新它们。

    Query Insights 在查询完成后的几分钟内就可以提供指标。查看 Cloud Monitoring 数据保留政策。Query Insights 跟踪存储在 Cloud Trace 中。查看 Cloud Trace 数据保留政策

    查看 Query Insights 信息中心

    Query Insights 信息中心会基于您选择的因素显示查询负载。查询负载是衡量选定时间范围内实例中所有查询的总工作量。 该信息中心提供了一系列过滤条件,可帮助您查看查询负载。

    如需打开 Query Insights 信息中心,请按照以下步骤操作:

    1. 如需打开实例的概览页面,请点击实例名称。
    2. 选择左侧导航面板中的查询数据分析标签页,或点击转到“查询数据分析”,详细了解查询和性能链接。

    Query Insights 信息中心将会打开。它会显示有关实例的以下信息:

    显示 Query Insights 信息中心,其中包含数据库、用户和地址的下拉菜单。在下拉菜单的右侧,有一个用于设置时间范围的过滤条件。此外,有一个图表显示了热门查询的数据库负载。该图表的底部是 CPU 容量、CPU 和 CPU 等待、IO 等待和锁定等待对应的选择框,以及查询和标记各有的一个标签页。
    • 数据库:过滤特定数据库或所有数据库上的查询负载。
    • 用户:过滤来自特定用户账号的查询负载。
    • 客户端地址:过滤来自特定 IP 地址的查询查询。
    • 时间范围:按时间范围(如小时、天、周、月或自定义范围)过滤查询。
    • 数据库负载图表:根据过滤的数据显示查询负载图表。
    • CPU 容量、CPU 和 CPU 等待、IO 等待和锁定等待:根据您选择的选项过滤负载。如需详细了解每种过滤条件,请参阅查看热门查询的数据库负载
    • 查询和标记。按所选查询或所选 SQL 查询标记过滤查询负载。请参阅过滤数据库负载

    查看所有查询的数据库负载

    数据库查询负载用于衡量所选数据库中的查询在一段时间内所执行的工作(以 CPU 秒为单位)。每个正在运行的查询都使用或等待 CPU 资源、IO 资源或锁定资源。数据库查询负载是在给定时间范围内完成的所有查询所花费的时间与挂钟时间之比。

    顶级 Query Insights 信息中心显示数据库负载 - 所有热门查询图表。通过信息中心上的下拉菜单,您可以过滤特定数据库、用户或客户端地址的图表。

    显示数据库负载图,其中包含 CPU 容量、CPU 和 CPU 等待时间、IO 等待和锁定等待。

    图表中的颜色线条表示查询负载,分为以下四个类别:

    • CPU 容量:实例上可用的 CPU 数量。
    • CPU 和 CPU 等待:活跃状态下查询所花费的时间与实际用时之比。IO 和锁定等待不会阻止处于活跃状态的查询。此指标可能意味着查询正在使用 CPU,或正在等待 Linux 调度器在其他进程正在使用 CPU 时安排用于运行查询的服务器进程。

    • IO 等待:等待 IO 的查询所花费的时间与实际用时之比。IO 等待包括读取 IO 等待和写入 IO 等待。

      如果您需要有关 IO 等待的信息明细,可以在 Cloud Monitoring 中查看这些信息。如需了解详情,请参阅 Cloud SQL 指标

    • 锁定等待:等待锁定的查询所花费的时间与实际用时之比。其中包括锁定等待、LwLock 等待和 BufferPin 锁定等待。如需查看锁定等待的信息明细,请使用 Cloud Monitoring。如需了解详情,请参阅 Cloud SQL 指标

    查看图表并使用过滤选项来探索以下问题:

    1. 查询负载较高吗?图表是否随着时间推移或上升?如果未看到高负载,则问题与您的查询无关。
    2. 负载高的时间有多长?是现在才高还是长时间都高?使用范围选择器选择不同的时间段,以了解问题持续了多长时间。放大以查看观察查询负载峰值的时间窗口。缩小以查看长达一周的时间轴。
    3. 导致高负载的原因是什么?您可以选择检查 CPU 容量、CPU 和 CPU 等待、锁定等待或 IO 等待的选项。这些选项中的每一个选项的图表都是不同的颜色,以便您可以轻松找到负载最高的选项。图表上的深蓝色线条表示系统的最大 CPU 容量。它允许您比较查询负载与 CPU 系统容量上限。这种比较可帮助您了解实例是否耗尽 CPU 资源。
    4. 哪个数据库遇到了负载?从“数据库”下拉菜单中选择不同的数据库,找出负载最高的数据库。
    5. 特定用户或 IP 地址是否会导致更高的负载?从下拉菜单中选择不同的用户和地址,以找出导致负载较高的用户和地址。

    过滤数据库负载

    您可以按查询或标记过滤数据库负载。

    按查询过滤

    查询表概述了导致查询加载次数最多的查询。下表显示了 Query Insights 信息中心上所选时间范围和选项的所有规范化查询。 它会按您选择的时间段内总执行时间对查询排序。

    显示数据库加载图,其中包含针对查询加载的负载,同时为 CPU 容量、CPU 和 CPU 等待、IO 等待和锁定等待选择过滤器。

    如需对表进行排序,请从过滤查询中选择列标题或属性。下表显示了以下属性:

    • 查询:规范化查询字符串。默认情况下,Query Insights 仅显示查询字符串中的 1024 个字符。

      标记为 UTILITY COMMAND 的查询通常包含 BEGINCOMMITEXPLAIN 命令或封装容器命令。

    • 数据库:运行查询的数据库。

    • 按总时间的负载/按 CPU 的负载/按 IO 等待的负载/按锁定等待的负载:可以过滤特定查询以查找最大负载的选项。

    • 平均执行时间(毫秒):查询执行的平均时间。

    • 调用次数:应用调用查询的次数。

    • 平均返回行数:查询平均返回行数。

    • 平均扫描行数:为查询扫描的平均行数。

    Query Insights 仅存储和显示规范化查询。默认情况下,Query Insights 不会收集 IP 地址或标记信息。您可以启用 Query Insights 来收集此信息,并在需要时停用收集功能。查询计划跟踪记录不会收集或存储任何常量值,并会移除常量可能显示的任何 PII 信息。

    Query Insights 会显示规范化查询,即 ? 替换字面量常量值。在以下示例中,名称常量会被移除,并会替换成 ?

    UPDATE
      "demo_customer"
    SET
      "customer_id" = ?::uuid,
      "name" = ?,
      "address" = ?,
      "rating" = ?,
      "balance" = ?,
      "current_city" = ?,
      "current_location" = ?
    WHERE
      "demo_customer"."id" = ?
    

    按查询标记过滤

    要排查应用问题,您必须先将标记添加到 SQL 查询。 查询加载标记提供选定标记的查询负载随时间的变化情况。

    Query Insights 提供以应用为中心的监控功能,可诊断使用 ORM 构建的应用的性能问题。 如果您负责整个应用堆栈,则 Query Insights 可从应用视图提供查询监控。查询标记可帮助您找到更高级别的结构(例如使用业务逻辑或微服务)中的问题。

    您可以按业务逻辑标记查询,例如使用付款、库存、业务分析或配送标记等。然后,您可以找到由各种业务逻辑创建的查询负载。例如,您可能会观察到意外事件,例如业务分析标记在下午 1 点出现峰值,或上周付款服务趋势出现异常增长。

    如需计算标记的数据库负载,Query Insights 会使用所选标记使用各查询所花费的时间。该工具使用挂钟时间来计算分钟边界处的完成时间。

    在 Query Insights 信息中心,如需查看标记表,请选择标记。该表按总加载时间对标记进行排序。

    显示 Query Insights 信息中心,其中包含标记负载和标记列表。

    您可以通过过滤标记中的属性或点击列标题对表进行排序。下表显示了以下属性:

    • 操作、控制器、框架、路由、应用、数据库驱动程序:您添加到查询的每个属性都会显示为一列。如果您想按标记过滤,必须至少添加这些属性中的一个。
    • 按总时间的负载/按 CPU 的负载/按 IO 等待的负载/按锁定等待的负载:用于过滤特定查询以找到每个选项的最大负载的选项。
    • 平均执行时间(毫秒):查询运行的平均时间。
    • 平均返回行数:查询平均返回行数。
    • 平均扫描行数:为查询扫描的平均行数。
    • 调用次数:应用调用查询的次数。
    • 数据库:运行查询的数据库。

    检查特定查询或标记

    如需确定查询或标记是否为问题的根本原因,请在查询标签页或标记标签页中分别执行以下操作:

    1. 如需按降序排序列表,请点击按总时间对负载进行排序标题。
    2. 点击列表顶部的查询或标记。它具有最高的负载,所耗时间比其他虚拟机更长。

    这将打开一个信息中心,其中显示所选查询或标记的详细信息。

    检查特定查询负载

    所选查询的信息中心如下所示:

    显示特定查询的数据库负载和延迟时间图表。

    数据库加载 - 特定查询图表显示规范化查询在一段时间内所执行的工作(以 CPU 秒为单位)。计算负载所用的时间是每分钟边界处完成的标准化查询所花费的时间与实际用时之比。位于表格的顶部,显示了规范化查询的前 1024 个字符,并移除了聚合和 PII 原因的字面量。

    显示包含特定查询的负载的数据库负载图,并针对 CPU 容量、CPU 和 CPU 等待、IO 等待和锁定等待选择过滤器。

    与总查询图一样,您可以按 DatabaseUserClient Address 过滤特定查询的负载。查询负载分为 CPU 容量CPU 和 CPU 等待IO 等待锁定等待

    检查带有特定标记的查询负载

    所选标记的信息中心如下所示。例如,如果来自微服务付款的所有查询都标记为 payment,您可以通过查看 payment 标记来查看热门查询负载量。

    显示了页面上特定标记的数据库负载和延迟时间图表。

    数据库负载 - 特定标记图表显示一段时间内与所选标记匹配的查询在所选数据库中执行的工作(以 CPU 秒为单位)。与总查询图一样,您可以按 DatabaseUserClient Address 过滤特定标记的负载。

    检查采样查询计划中的操作

    查询计划会获取查询的示例,并将其拆分为单独的操作。它解释并分析查询中的每个操作。

    MySQL 5.7 提供带 EXPLAIN 视图的估算的查询计划,而 MySQL 8.0 及更高版本提供带 EXPLAIN ANALYZE 视图的执行的查询计划。估算的查询计划提供估算的查询执行时间,而执行的查询计划则提供给定查询的每个执行步骤的实时信息。

    EXPLAIN 语句支持的以下查询都支持 MySQL 5.7 中的查询计划:

    • 对于单个表:INSERT、SELECT、UPDATE 和 DELETE。

    • 对于多个表:SELECT、UPDATE 和 DELETE。

    您可以针对 EXPLAIN ANALYZE 支持的所有查询在 MySQL 8.0 及更高版本中生成查询计划。此工具会显示 MySQL 对单个表和多个表执行 SELECT 查询的情况。Cloud SQL 不支持生成多表数据操纵语言 (DML) 查询计划,因为 EXPLAIN ANALYZE 不支持这些查询。

    示例查询计划为与标准化查询相关的查询计划示例提供 EXPLAIN ANALYZE 视图。这些是执行的查询计划,提供查询计划中每项操作所用的活动时间明细。

    查询计划示例图表显示了在特定时间运行的所有查询计划以及每个计划运行的时长。您可以更改每分钟捕获查询计划样本的速率。请参阅启用 Query Insights

    示例查询计划的图表,其中包含它们在图表底部(x 轴)运行的时间,以及它们在右侧(y 轴)运行的秒数。

    默认情况下,右侧面板会显示耗时最长的示例查询计划的详细信息,如查询计划示例图表中所示。如需查看其他示例查询计划的详细信息,请点击图表上的相关圆圈。展开的详细信息显示查询计划中的所有操作的模型。每项操作都会显示延迟时间、返回的行数以及该操作的费用。选择操作后,您可以查看更多详细信息,例如共享命中块、架构类型、循环和方案行。

    查询计划显示查询运行的每个操作的延迟时间和费用。它从一个聚合开始,该聚合返回 48 行,延迟时间为 31.06 毫秒,费用为 296.34。下一个操作是一个嵌套循环,该循环会拆分为另一个嵌套循环和一个具体实体。嵌套循环拆分为另一个嵌套循环和一个索引扫描。该具体化元素指向序列扫描。

    通过查看以下问题来缩小问题范围:

    1. 资源消耗量是多少?
    2. 它与其他查询有何关系?
    3. 消耗量是否随着时间的推移而变化?

    检查延迟时间

    延迟时间是完成规范化查询所需的时间(实际用时)。您可以使用延迟时间图表来检查查询或标记的延迟时间。延迟时间信息中心显示第 50、95 和 99 百分位的延迟时间,以找到离群值行为。

    下图显示针对特定查询的第 50 百分位的数据库负载图表,选择 CPU 容量、CPU 和 CPU 等待时间、IO 等待和锁定等待过滤条件。

    显示针对特定查询的查询延迟时间图表,过滤条件选择用于选择 CPU 容量、CPU 和 CPU 等待时间、IO 等待和锁定等待。

    并行查询的延迟时间是按实际用时衡量的,即使查询负载可能更高(由于使用了多个核心来运行查询的一部分)也是如此。

    通过查看以下问题来缩小问题范围:

    1. 导致高负载的原因是什么?选择查看 CPU 容量、CPU 和 CPU 等待、I/O 等待或锁定等待的选项。
    2. 负载高的时间有多长?只是现在高吗?还是长时间位于高负载?更改时间范围以查找加载开始效果不佳的日期和时间。
    3. 延迟时间是否存在急剧增加? 更改时间窗口来研究规范化查询的历史延迟时间。

    跟踪问题的来源

    当您找到负载最高的区域和时间时,请使用跟踪记录来深入分析,从而确定问题的根源。

    为了帮助您确定问题的具体来源(例如模型、视图、控制器、路由、主机或用户),Query Insights 提供了上下文相关的端到端应用跟踪记录视图,以帮助您了解特定请求在数据库层发生了什么,并按模型、视图、控制器和路由找到有问题的查询的来源。

    如果您启用了 OpenCensusOpenTelemetry,则 opencensus span 信息会与 SQL 注释内的标记信息一起发送到数据库中。从应用到 Cloud Logging 的任何跟踪记录都会与数据库查询计划跟踪记录相关联,可帮助确定问题来源。

    点击示例查询屏幕中的端到端标签页,可查看上下文中的跟踪记录。

    选择“端到端”标记可查看有关该标记的具体信息。摘要显示了该标签每个操作的远程过程调用 (RPC) 和总持续时间(以毫秒为单位)。

    如需确定造成问题的客户端和用户,请使用热门客户端地址热门用户表格,以查找最高的负载。您可以向过滤条件添加用户或 IP 地址,以进一步分析特定用户或客户地址。 表中的详细信息包括查询负载百分比、平均执行时间(以毫秒为单位)和调用时间。

    图片显示,对于热门客户端地址,负载为 100%,平均执行时间为 19568 毫秒,调用次数为 1226 次。对于顶级用户,用户 postgres 的负载为 100%,平均执行时间为 19568 毫秒,被调用 1,226 次。

    您可以使用 Cloud Trace 查看查询计划中每个步骤的端到端跟踪。在 Query Insights 信息中心内,点击在跟踪记录中查看链接,以打开 Cloud Trace 工具。跟踪图表显示所选时间段内运行的所有跟踪记录。

    跟踪记录图表会显示选定时间段内运行的所有跟踪记录,此例中为一小时。该页面还有一个表,显示延迟、HTTP 方法、网址以及 trace.cd 的运行时间

    如需了解详情,请参阅查找和查看跟踪记录

    向 SQL 查询添加标记

    标记 SQL 查询可简化应用问题排查。您可以使用 sqlcommenter 自动或手动向 SQL 查询添加标记。

    将 sqlcommenter 与 ORM 搭配使用

    使用 ORM 而不是直接编写 SQL 查询时,您可能找不到导致性能问题的应用代码。您可能还需要分析应用代码对查询性能的影响。为了解决此问题,Query Insights 提供了一个名为 sqlcommenter 的开源库。对于使用 ORM 工具检测哪些应用代码导致性能问题的开发者,此库非常有用。

    如果您同时使用 ORM 和 sqlcommenter,则系统会自动创建标记。您无需在应用中添加或更改代码。

    您可以在应用服务器上安装 sqlcommenter。插桩库允许将 MVC 框架的应用信息连同查询一起作为 SQL 注释一起传播到数据库。数据库会获取这些标记,并开始按标记记录和聚合统计信息,这些统计信息与规范化查询汇总的统计信息不同。Query Insights 会显示标记,以便让您了解哪个应用导致查询负载,并找到导致性能问题的应用代码。

    在 SQL 数据库日志中检查结果时,结果如下所示:

    SELECT * from USERS /*action='run+this',
    controller='foo%3',
    traceparent='00-01',
    tracestate='rojo%2'*/
    

    支持的标记包括控制器名称、路由、框架和操作。

    以下编程语言支持 sqlcommenter 中的 ORM 工具集:

    Python
    • Django
    • psycopg2
    • Sqlalchemy
    • Flask
    Java
    • Hibernate
    • Spring
    Ruby
    • Rails
    Node.js
    • Knex.js
    • Sequelize.js
    • Express.js

    如需详细了解 sqlcommenter 以及如何在 ORM 框架中使用 sqlcommenter,请参阅 sqlcommenter 文档

    使用 sqlcommenter 添加标记

    如果您未使用 ORM,则必须以正确的 SQL 注释格式手动将 sqlcommenter 标记或注释添加到 SQL 查询。您还必须使用包含序列化键值对的注释来扩充每个 SQL 语句。请至少使用以下其中一个密钥:

    • action=''
    • controller=''
    • framework=''
    • route=''
    • application=''
    • db driver=''

    Query Insights 会丢弃所有其他键。

    停用 Query Insights

    控制台

    如需使用 Google Cloud 控制台停用 Cloud SQL 实例的 Query Insights,请按照以下步骤操作:

    1. 在 Google Cloud 控制台中,转到 Cloud SQL 实例页面。

      转到“Cloud SQL 实例”

    2. 如需打开实例的概览页面,请点击实例名称。
    3. 配置图块中,点击修改配置
    4. 配置选项部分中,展开查询数据分析
    5. 清除启用 Query Insights 复选框。
    6. 点击保存

    gcloud

    要使用 gcloud 停用 Cloud SQL 实例的 Query Insights,请在将 INSTANCE_ID 替换为实例的 ID 之后,使用 --no-insights-config-query-insights-enabled 标志运行 gcloud sql instances patch,如下所示。

    gcloud sql instances patch INSTANCE_ID \
    --no-insights-config-query-insights-enabled
      

    REST

    要使用 REST API 停用 Cloud SQL 实例的 Query Insights,请调用 instances.patch方法并将 queryInsightsEnabled 设置为 false,如下所示。

    在使用任何请求数据之前,请先进行以下替换:

    • project-id:项目 ID。
    • instance-id:实例 ID。

    HTTP 方法和网址:

    PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id

    请求 JSON 正文:

    {
      "settings" : { "insightsConfig" : { "queryInsightsEnabled" : false } }
    }
    

    如需发送您的请求,请展开以下选项之一:

    您应该收到类似以下内容的 JSON 响应:

    {
      "kind": "sql#operation",
      "targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id",
      "status": "PENDING",
      "user": "user@example.com",
      "insertTime": "2021-01-28T22:43:40.009Z",
      "operationType": "UPDATE",
      "name": "operation-id",
      "targetId": "instance-id",
      "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/operations/operation-id",
      "targetProject": "project-id"
    }
    

    后续步骤