使用查询存储监视 Azure Database for MariaDB 的性能

重要

Azure Database for MariaDB 已列入停用计划。 强烈建议迁移到 Azure Database for MySQL。 有关迁移到 Azure Database for MySQL 的详细信息,请参阅 Azure Database for MariaDB 发生了什么情况?

适用于: Azure Database for MariaDB 10.2

使用 Azure Database for Mariadb 中的查询存储功能可以跟踪一段时间内的查询性能。 通过帮助快速查找运行时间最长且资源最密集的查询,查询存储可简化性能故障排除。 查询存储自动捕获查询和运行时统计信息的历史记录,并保留它们以供查看。 它按时间范围分隔数据,以便可以查看数据库使用模式。 所有用户、数据库和查询的数据都存储在 Azure Database for MariaDB 实例的 mysql 架构数据库中。

使用查询存储的常见场景

可以在许多场景中使用查询存储,包括:

  • 检测回归查询
  • 确定在给定时间范围内执行查询的次数
  • 比较跨时间范围查询的平均执行时间,以查看较大的增量

启用查询存储

查询存储是一项选择加入功能,因此默认情况下它在服务器上未处于活动状态。 对于给定服务器上的所有数据库,查询存储处于全局启用或禁用状态,且无法为每个数据库打开或关闭它。

使用 Azure 门户启用查询存储

  1. 登录到 Azure 门户,选择你的 Azure Database for MariaDB 服务器。
  2. 在菜单的“设置”部分中选择“服务器参数” 。
  3. 搜索 query_store_capture_mode 参数。
  4. 将值设置为 ALL,然后保存

若要在查询存储中启用等待统计信息,请执行以下操作:

  1. 搜索 query_store_wait_sampling_capture_mode 参数。
  2. 将值设置为 ALL,然后保存

留出最多 20 分钟以便第一批数据保存到 mysql 数据库中。

查询存储中的信息

查询存储有两个存储:

  • 用于保存查询执行统计信息的运行时统计信息存储。
  • 用于保存等待统计信息的等待统计信息存储。

为尽量减少空间使用量,运行时统计信息存储中的运行时执行统计信息在一个固定的、可配置的时间范围内聚合。 通过查询这些查询存储视图,这些存储中的信息是可见的。

以下查询返回有关查询存储中的查询的信息:

SELECT * FROM mysql.query_store;

或此等待统计信息的查询:

SELECT * FROM mysql.query_store_wait_stats;

查找等待查询

注意

不应该在工作负荷高峰时段启用等待统计信息,或者对于敏感的工作负荷无限期地启用等待统计信息。
对于在 CPU 利用率较高的情况下运行的工作负荷,或在配置了较低 vCore 的服务器上运行的工作负荷,启用等待统计信息时请格外小心。 不应无限期地启用等待统计信息。

等待事件类型按相似性将不同的等待事件组合到存储桶中。 查询存储提供等待事件类型、特定等待事件名称和有争议的查询。 能将此等待信息与查询运行时统计信息相关联,意味着可更深入地了解有助于查询性能特征的因素。

以下是一些示例,说明如何使用查询存储中的等待统计信息获得有关工作负载的更多见解:

观测 操作
高锁定等待 检查受影响查询的查询文本,并确定目标实体。 在查询存储中查找修改同一实体的其他查询,这些查询经常执行和/或持续很长时间。 确定这些查询后,请考虑更改应用程序逻辑以提高并发性,或使用限制较少的隔离级别。
高缓冲 IO 等待 在查询存储中查找具有大量物理读取的查询。 如果它们匹配具有高 IO 等待的查询,考虑在基础实体上引入索引,以便进行搜索而不是扫描。 这将最小化查询的 IO 开销。 检查门户中服务器的“性能建议”,以查看是否存在可优化查询的此服务器的索引建议。
高内存等待 在查询存储中查找消耗内存最多的查询。 这些查询可能会延迟受影响查询的进度。 检查门户中服务器的“性能建议”,以查看是否存在可优化这些查询的索引建议。

配置选项

启用查询存储时,它会在 15 分钟的聚合时段内保存数据,每个时段最多可存储 500 个不同查询。

以下选项可用于配置查询存储参数。

参数 说明 默认 范围
query_store_capture_mode 根据值打开/关闭查询存储功能。 注意:如果 performance_schema 为 OFF,则打开 query_store_capture_mode 会打开 performance_schema,以及此功能所需的一部分性能架构检测。 ALL NONE、ALL
query_store_capture_interval 查询存储捕获时间间隔,以分钟为单位。 允许指定聚合查询指标的时间间隔 15 5 - 60
query_store_capture_utility_queries 打开或关闭捕获系统中正在执行的所有实用工具查询的功能。 YES、NO
query_store_retention_period_in_days 在查询存储中保留数据的时限,以天为单位。 7 1 - 30

以下选项专用于等待统计信息。

参数 说明 默认 范围
query_store_wait_sampling_capture_mode 允许打开/关闭等待统计信息。 NONE、ALL
query_store_wait_sampling_frequency 更改等待采样的频率,以秒为单位。 5 到 300 秒。 30 5-300

注意

目前,query_store_capture_mode 将取代此配置,这意味着,query_store_capture_modequery_store_wait_sampling_capture_mode 都必须启用 ALL,才能正常查询等待统计信息。 如果关闭 query_store_capture_mode,则等待统计信息也会关闭,因为等待统计信息利用已启用的 performance_schema,以及查询存储捕获的 query_text。

使用 Azure 门户获取或设置参数的不同值。

视图和函数

使用以下视图和函数查看并管理查询存储。 具有选择权限公共角色的任何人都可使用这些视图来查看查询存储中的数据。 这些视图仅在 mysql 数据库中提供。

删除文本和常数后,通过查看查询的结构来规范化查询。 如果除文本值之外两个查询均相同,则它们将具有相同的哈希值。

mysql.query_store

此视图返回查询存储中的所有数据。 每个不同的数据库 ID、用户 ID 和查询 ID 都有一行。

名称 数据类型 IS_NULLABLE 说明
schema_name varchar(64) 架构名称
query_id bigint(20) 为特定查询生成的唯一 ID,如果在不同的架构中执行同一个查询,将生成新的 ID
timestamp_id timestamp 执行查询时的时间戳。 此值基于 query_store_interval 配置
query_digest_text longtext 删除所有文本后的规范化查询文本
query_sample_text longtext 首次出现的包含文本的实际查询
query_digest_truncated bit YES 查询文本是否已截断。 如果查询超过 1 KB,则值为 Yes
execution_count bigint(20) 针对此时间戳 ID/在配置的间隔时间段内执行该查询的次数
warning_count bigint(20) 此查询在该时间间隔内生成的警告数
error_count bigint(20) 此查询在该时间间隔内生成的错误数
sum_timer_wait Double 此查询在该时间间隔内的总执行时间
avg_timer_wait Double 此查询在该时间间隔内的平均执行时间
min_timer_wait Double 此查询的最小执行时间
max_timer_wait Double 最大执行时间
sum_lock_time bigint(20) 在此时间范围内对此查询执行的所有锁花费的总时间
sum_rows_affected bigint(20) 受影响的行数
sum_rows_sent bigint(20) 发送到客户端的行数
sum_rows_examined bigint(20) 检查的行数
sum_select_full_join bigint(20) 完整联接的数目
sum_select_scan bigint(20) select 扫描数
sum_sort_rows bigint(20) 排序的行数
sum_no_index_used bigint(20) 查询未使用任何索引的次数
sum_no_good_index_used bigint(20) 查询执行引擎未使用任何适当索引的次数
sum_created_tmp_tables bigint(20) 创建的临时表总数
sum_created_tmp_disk_tables bigint(20) 在磁盘中创建的临时表总数(生成 I/O)
first_seen timestamp 在聚合时段发生第一次查询的时间 (UTC)
last_seen timestamp 在此聚合时段发生最后一次查询的时间 (UTC)

mysql.query_store_wait_stats

此视图返回查询存储中的等待事件数据。 每个不同的数据库 ID、用户 ID、查询 ID 和事件都有一行。

名称 数据类型 IS_NULLABLE 说明
interval_start timestamp 间隔开始时间(15 分钟增量)
interval_end timestamp 间隔结束时间(15 分钟增量)
query_id bigint(20) 针对规范化查询生成的唯一 ID(从查询存储)
query_digest_id varchar(32) 删除所有文本后的规范化查询文本(从查询存储)
query_digest_text longtext 首次出现的包含文本的实际查询(从查询存储)
event_type varchar(32) 等待事件的类别
event_name varchar(128) 等待事件的名称
count_star bigint(20) 在查询间隔内采样的等待事件数
sum_timer_wait_ms Double 此查询在该时间间隔内的总等待时间(以毫秒为单位)

函数

名称 说明
mysql.az_purge_querystore_data(TIMESTAMP) 清除给定时间戳之前的所有查询存储数据
mysql.az_procedure_purge_querystore_event(TIMESTAMP) 清除给定时间戳之前的所有等待事件数据
mysql.az_procedure_purge_recommendation(TIMESTAMP) 清除其过期时间在给定时间戳之前的建议

限制和已知问题

  • 如果 MariaDB 服务器启用了参数 default_transaction_read_only,查询存储将无法捕获数据。
  • 如果遇到较长的 Unicode 查询(>= 6000 个字节),查询存储功能可能会中断。
  • 等待统计信息的保留期为 24 小时。
  • 等待统计信息使用样本来捕获一部分事件。 可以使用参数 query_store_wait_sampling_frequency 来修改频率。
  • 版本 10.3 不支持查询存储。

后续步骤