MySQL8.0使用sys.statement_performance_analyzer排查性能问题

MySQL8.0使用sys.statement_performance_analyzer()排查性能问题

简介

在MySQL8.0中提供了提供了许多性能排查的表,视图,工具等。其中statement_performance_analyzer()则是sys库下的一个存储过程,用于生成events_statements_summary_by_digest表的两个快照,并对比两个快照,生成增量报告,这对于查看高峰时系统在执行哪些查询非常有用。

参数

参数如下表

参数有效值描述
actionSnapshot:创建快照,默认events_statements_summary_by_digest,可通过table参数修改
Overall:基于table参数指定的表生成分析报告,
Delta:生成增量分析报告,增量是基于table参数与已有的快照进行对比生成
create_tmp:创建临时表,可用于后续计算增量
create_table:创建普通表,可用于后续计算增量
save:保存快照到table参数指定的表中
cleanup:移除用于快照和增量的临时表
执行此存储过程的动作描述
table<schema>.<table>用于需要表名的操作,格式为<schema>.<table>,不能使用反引号,schema与table之间不能出现点
viewswith_runtimes_in_95th_percentile:使用statements_with_runtimes_in_95th_percentile视图
analysis:使用statement_analysis视图
with_errors_or_warnings:使用statements_with_errors_or_warnings视图
with_full_table_scans:使用 statements_with_full_table_scans视图.
with_sorting:使用statements_with_sorting视图
with_temp_tables:使用statements_with_temp_tables视图
custom:使用自定义视图
可以包含多个视图名,用逗号隔开

常见使用用法

用法一 生成statement_analysis增量报告

创建一个statement_analysis增量报告,,具体步骤如下:

  1. 创建临时表存储初始化的快照

    -- 不记录当前线程操作
    CALL sys.ps_setup_disable_thread(CONNECTION_ID());
    -- 创建存放快照的schema
    create database if not exists monitor;
    -- 创建临时表
    CALL sys.statement_performance_analyzer('create_tmp', 'monitor.tmp_ini', NULL);
    
  2. 生成初始化快照

    CALL sys.statement_performance_analyzer('snapshot', NULL, NULL);
    
  3. 保存初始化快照在临时表中

    CALL sys.statement_performance_analyzer('save', 'monitor.tmp_ini', NULL);
    
  4. 等待一分钟

    DO SLEEP(60);
    
  5. 创建新快照

    CALL sys.statement_performance_analyzer('snapshot', NULL, NULL);
    
  6. 基于新快照与初始化快照进行增量性能分析

    CALL sys.statement_performance_analyzer('delta', 'monitor.tmp_ini', 'analysis')\G
    
  7. 清理环境

    CALL sys.statement_performance_analyzer('cleanup', NULL, NULL);
    DROP TEMPORARY TABLE monitor.tmp_ini;
    CALL sys.ps_setup_enable_thread(CONNECTION_ID());
    

用法二 自定义视图

使用自定义视图显示按总执行时间排序的前10个查询,在Linux中使用watch命令每分钟刷新视图,具体步骤如下:

  1. 创建自定义视图

    DROP DATABASE IF EXISTS monitor;
    CREATE DATABASE monitor;
    CREATE OR REPLACE VIEW monitor.my_statements AS
           SELECT sys.format_statement(DIGEST_TEXT) AS query,
                  SCHEMA_NAME AS db,
                  COUNT_STAR AS exec_count,
                  sys.format_time(SUM_TIMER_WAIT) AS total_latency,
                  sys.format_time(AVG_TIMER_WAIT) AS avg_latency,
                  ROUND(IFNULL(SUM_ROWS_SENT / NULLIF(COUNT_STAR, 0), 0)) AS rows_sent_avg,
                  ROUND(IFNULL(SUM_ROWS_EXAMINED / NULLIF(COUNT_STAR, 0), 0)) AS rows_examined_avg,
                  ROUND(IFNULL(SUM_ROWS_AFFECTED / NULLIF(COUNT_STAR, 0), 0)) AS rows_affected_avg,
                  DIGEST AS digest
             FROM performance_schema.events_statements_summary_by_digest
           ORDER BY SUM_TIMER_WAIT DESC;
    
  2. 生成普通表

    CALL sys.statement_performance_analyzer('create_table', 'monitor.digests_prev', NULL);
    
  3. watch监控

    shell> watch -n 60 "mysql sys --table -e \"
     SET @sys.statement_performance_analyzer.view = 'monitor.my_statements';
     SET @sys.statement_performance_analyzer.limit = 10;
     CALL statement_performance_analyzer('snapshot', NULL, NULL);
     CALL statement_performance_analyzer('delta', 'monitor.digests_prev', 'custom');
     CALL statement_performance_analyzer('save', 'monitor.digests_prev', NULL);
     \""
    

参考

  • https://dev.mysql.com/doc/refman/8.0/en/sys-statement-performance-analyzer.html
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: fieldType = FieldType.TEXT 表示该字段是文本类型。 analyzer = Analyzer.IK_SMART 表示使用 IK_SMART 分词器对该字段进行分词。 searchAnalyzer = Analyzer.IK_MAX_WORD 表示使用 IK_MAX_WORD 分词器对该字段进行搜索。 ### 回答2: 根据提供的信息,我理解您遇到了一个问题:在进行es特殊字符查询时无法查找到结果。根据您提供的字段的设置,将为您解释可能的原因。 首先,您指定了字段类型为FieldType.TEXT,这意味着该字段将被分析器处理为文本类型数据。接下来,您指定了分析器为Analyzer.IK_SMART,搜索分析器为Analyzer.IK_MAX_WORD。 IK分析器是一种面向中文文本的分析器,可以将文本拆分成合适的词语以便更准确的进行搜索。IK分析器有两种模式可供选择:IK_SMART和IK_MAX_WORD。IK_SMART模式是一种智能模式,会尽量将文本进行最准确的拆分,以尽可能包含更多的搜索结果。而IK_MAX_WORD模式会将文本切分为更多的词语,以尽可能获取更多的搜索结果。 然而,如果您遇到特殊字符查询不到结果的情况,可能是因为您所使用的查询方式不适用于特殊字符。在进行使用特殊字符的查询时,可能需要使用其他的操作符或查询方法来确保能够正确匹配到特殊字符。例如,您可以使用正则表达式查询来匹配特殊字符,或者使用原始查询语法来确保特殊字符被正确解析。 另外,还有一种可能性是特殊字符在被分析器处理时发生了改变,导致不能正确匹配到您预期的结果。这时您可以尝试更改分析器配置或者选择其他的分析器来处理特殊字符。 总结来说,要在es特殊字符查询中获得正确的结果,您需要确保使用合适的操作符或查询方法,并确保您所选择的分析器正确处理特殊字符。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值