首页 > 数据库 >MYSQL 8 从PS说起,但不止于PS , 不在使用淘汰的慢查询日志,那我怎么查慢查询(6)...

MYSQL 8 从PS说起,但不止于PS , 不在使用淘汰的慢查询日志,那我怎么查慢查询(6)...

时间:2023-06-22 13:06:10浏览次数:106  
标签:PS name text timer 查询 MYSQL wait digest schema


MYSQL 8 从PS说起,但不止于PS , 不在使用淘汰的慢查询日志,那我怎么查慢查询(6)..._java

这是关于MYSQL8 获取信息的方式的第六篇,终于到达了慢日志查询的位置,在MYSQL的DBA 的管理员的心目中,pt-query-digest 和 SLOW QUERY LOG 是分析慢查询的唯一的方式。实际上在MYSQL 8 中这样的慢查询的数据获取方式,已经被淘汰了,或者说不合时宜了。

主要的原因是获取信息的时效性的问题,获取慢查询需要去通过PT工具来读取SLOW LOG文件,并输出超过慢查询时间的语句信息。

SELECT

SCHEMA_NAME,

digest,

digest_text,

round(sum_timer_wait/ 1000000000000, 6) as second,

count_star,

now() as check_time

FROM performance_schema.events_statements_summary_by_digest

where digest_text not like 'CREATE%' and digest_text not like 'ALTER%'

ORDER BY sum_timer_wait DESC LIMIT 10;

MYSQL 8 从PS说起,但不止于PS , 不在使用淘汰的慢查询日志,那我怎么查慢查询(6)..._mysql_02

通过查询的方式将慢查询语句摘录出来,但实际上又出现新的问题,就是每次将数据都搜索出来后,而这就会产生两个问题

1  重复数据的问题

https://blog.monyog.com/troubleshooting-mysql-performance-issues/

https://www.liquidweb.com/kb/mysql-performance-identifying-long-queries/

https://vladmihalcea.com/mysql-query-profiling-performance-schema/

2  如何汇总数据的问题

SELECT

SCHEMA_NAME,

digest,

digest_text,

round(sum_timer_wait/ 1000000000000, 6) as second,

count_star,

now() as check_time

FROM performance_schema.events_statements_summary_by_digest

where digest_text not like 'CREATE%' and digest_text not like 'ALTER%' and schema_name <> 'information_schema' and schema_name <> 'sys'

ORDER BY sum_timer_wait DESC LIMIT 10;

MYSQL 8 从PS说起,但不止于PS , 不在使用淘汰的慢查询日志,那我怎么查慢查询(6)..._mysql_03

我们通过 digest 的方式进行信息的汇总,因为类似结构的查询语句会产生,  同样的码,在插入时将插入的方式变更为判断并无数据插入数据,有数据更新数据的方式并将这个位置变更为唯一索引。

在我们的performance_schema中 show tables like 'events_statement%',可以看到通过 event_statement 里有很多的从不同的维度对MYSQL 中产生的语句进行分析表,其中主要分为 current,  histogram , history , summary 几大类,他们分别也承载了慢查询中不同的功能。

MYSQL 8 从PS说起,但不止于PS , 不在使用淘汰的慢查询日志,那我怎么查慢查询(6)..._java_04

下面我们就看看MYSQL 怎么来满足查询的需求

1  实时的观测,MYSQL 系统中语句的查询情况,可以称之为实时语句查询监控

select current_schema,SQL_TEXT,timer_wait/1000000000000 as 等待时间,lock_time/1000000000000 as 锁的时间,errors,rows_sent,rows_examined,select_scan,sort_rows

from events_statements_current

where  SQL_TEXT IS NOT NULL;

MYSQL 8 从PS说起,但不止于PS , 不在使用淘汰的慢查询日志,那我怎么查慢查询(6)..._java_05

在MYSQL 8 

2  当查询某些表没有数据如

select * from events_statements_history_long;

MYSQL 8 从PS说起,但不止于PS , 不在使用淘汰的慢查询日志,那我怎么查慢查询(6)..._java_06

这样的情况很可能是是由于你在 setup_consumers 中并没有打开相关的enabled 数据造成的。那么我们需要打开相关表的设置。

update setup_consumers set enabled = 'YES' where name = 'events_statements_history_long' ;

MYSQL 8 从PS说起,但不止于PS , 不在使用淘汰的慢查询日志,那我怎么查慢查询(6)..._数据分析_07

打开后,相关的表就可以接收到数据了

select * from events_statements_history_long;

MYSQL 8 从PS说起,但不止于PS , 不在使用淘汰的慢查询日志,那我怎么查慢查询(6)..._python_08

select event_name,timer_wait/1000000000000 as wait_second,sql_text,digest,errors,rows_affected,rows_sent,created_tmp_disk_tables,select_scan

from events_statements_history_long

where current_schema  in ('sys','performance_schema','information_schema') and event_name like 'statement/sql%';

MYSQL 8 从PS说起,但不止于PS , 不在使用淘汰的慢查询日志,那我怎么查慢查询(6)..._java_09

除此以外,我们还可以通过events_statements_summary_by_digest

来展示目前MYSQL 系统中 TOP 10 最慢的语句有那些。

MYSQL 8 从PS说起,但不止于PS , 不在使用淘汰的慢查询日志,那我怎么查慢查询(6)..._数据库_10

select digest_text,count_star,(AVG_TIMER_WAIT/1000000000000) as avg_wait_time_second,(MAX_TIMER_WAIT/1000000000000) as max_timer_wait,SUM_ROWS_SENT,SUM_SELECT_SCAN,SUM_NO_INDEX_USED,fIRST_SEEN,LAST_SEEN,QUERY_SAMPLE_TEXT

from events_statements_summary_by_digest

where (AVG_TIMER_WAIT/1000000000000) > 0.1 and digest_text not like 'CREATE%' and digest_text not like 'ALTER%'

ORDER BY LAST_SEEN limit 10;

以上的信息足以满足日常的慢查询分析的需求。除此以外,我们还可以衍生出更多与监控有关的信息集合

1   通过performance_schema  中查询的信息,来发现MYSQL 系统中未使用的索引信息。这样就可以查看索引的使用情况,来判断我们建立的索引在使用中是否存在根本就用不到的情况。

SELECT DISTINCT s.table_schema, s.table_name, s.index_name

--     , i.count_star

  FROM information_schema.statistics AS s

  LEFT JOIN performance_schema.table_io_waits_summary_by_index_usage AS i

         ON (s.table_schema = i.object_schema AND s.table_name = i.object_name AND s.index_name = i.index_Name)

 WHERE s.table_schema NOT IN ('mysql', 'performance_schema', 'sys', 'information_schema')

   AND s.index_name != 'PRIMARY'

   AND i.count_star = 0

 ORDER BY s.table_schema, s.table_name, s.index_name;

MYSQL 8 从PS说起,但不止于PS , 不在使用淘汰的慢查询日志,那我怎么查慢查询(6)..._数据库_11

2  查询MYSQL 查询中出现生成物理磁盘查询的情况

SELECT schema_name, digest_text AS statement, count_star AS cnt

     , sum_created_tmp_disk_tables AS tmp_disk_tables, sum_created_tmp_tables AS tmp_tables

  FROM performance_schema.events_statements_summary_by_digest

 WHERE sum_created_tmp_disk_tables >= 0 and schema_name not in ('sys','information_schema','performance_schema','mysql')  and schema_name is not null

    ;

MYSQL 8 从PS说起,但不止于PS , 不在使用淘汰的慢查询日志,那我怎么查慢查询(6)..._java_12

上面由于要有展示,但此时系统中并未有符合语句所以将 sum_created_tmp_disk_tables  设置成 >= 0 实际上可以改成下面的写法。

SELECT schema_name, digest_text AS statement, count_star AS cnt

     , sum_created_tmp_disk_tables AS tmp_disk_tables, sum_created_tmp_tables AS tmp_tables

  FROM performance_schema.events_statements_summary_by_digest

 WHERE sum_created_tmp_disk_tables > 0 and schema_name not in ('sys','information_schema','performance_schema','mysql')  and schema_name is not null and 

 digest_text not like 'CREATE%' and  digest_text not like 'ALTER%' and digest_text not like 'explain%' and digest_text not like 'set%' 

    ;

通过以上的一些语句完全可以摆脱之前的SLOW LOG的工作模式,实际上其他的数据库本身也并没有SLOW LOG ,都是通过系统表的方式来获取慢查询语句,如 SQL SERVER ,ORACLE 等。

MYSQL 作为开源流行的数据库,从MYSQL 8 后,完全可以不在使用原有的方式去捕捉慢查询数据。至少不会为设置某些过滤语句的时间在去犯难,所有运行语句的时间都会被记录,我们所做的只是需要过滤这些语句即可。

最后下面的SQL 可以统计整体预计执行的信息并且以,从最慢的SQL 开始,包含各种语句的维度信息

SELECT left(digest_text, 64)

     , ROUND(SUM(timer_end-timer_start)/1000000000, 1) AS tot_exec_ms

     , ROUND(SUM(timer_end-timer_start)/1000000000/COUNT(*), 1) AS avg_exec_ms

     , ROUND(MIN(timer_end-timer_start)/1000000000, 1) AS min_exec_ms

     , ROUND(MAX(timer_end-timer_start)/1000000000, 1) AS max_exec_ms

     , ROUND(SUM(timer_wait)/1000000000, 1) AS tot_wait_ms

     , ROUND(SUM(timer_wait)/1000000000/COUNT(*), 1) AS avg_wait_ms

     , ROUND(MIN(timer_wait)/1000000000, 1) AS min_wait_ms

     , ROUND(MAX(timer_wait)/1000000000, 1) AS max_wait_ms

     , ROUND(SUM(lock_time)/1000000000, 1) AS tot_lock_ms

     , ROUND(SUM(lock_time)/1000000000/COUNT(*), 1) AS avglock_ms

     , ROUND(MIN(lock_time)/1000000000, 1) AS min_lock_ms

     , ROUND(MAX(lock_time)/1000000000, 1) AS max_lock_ms

     , MIN(LEFT(DATE_SUB(NOW(), INTERVAL (isgs.VARIABLE_VALUE - TIMER_START*10e-13) second), 19)) AS first_seen

     , MAX(LEFT(DATE_SUB(NOW(), INTERVAL (isgs.VARIABLE_VALUE - TIMER_START*10e-13) second), 19)) AS last_seen

     , COUNT(*) as cnt

  FROM performance_schema.events_statements_history_long

  JOIN performance_schema.global_status AS isgs

 WHERE isgs.variable_name = 'UPTIME'

 GROUP BY LEFT(digest_text,64)

 ORDER BY tot_exec_ms DESC

MYSQL 8 从PS说起,但不止于PS , 不在使用淘汰的慢查询日志,那我怎么查慢查询(6)..._java_13

MYSQL 8 从PS说起,但不止于PS , 不在使用淘汰的慢查询日志,那我怎么查慢查询(6)..._数据分析_14

标签:PS,name,text,timer,查询,MYSQL,wait,digest,schema
From: https://blog.51cto.com/u_14150796/6534669

相关文章

  • POSTGRESQL 短查询优化,独立索引与组合索引 8
    这是一个关于POSTGRESQL查询的优化系列,这已经是这个系列的第八集了,接上期,在OLTP查询中我们需要注意的查询优化的地方非常多,稍不留意就会在一些问题上的操作导致查询的数据逻辑错误。继续上次的问题,在查询中,针对事件的查询问题,我们一般处理的模式 1 针对具体事件字段的时间标注......
  • MYSQL 从performance_schema说起,但不止于PS (1)
    以下的内容,希望你的环节是在8.011以上的环境中操作,部分需要在8.018以上环境操作MYSQL如果你在使用MYSQL8的版本,那么performanceschema的确的重新认识一下了。在重新认识mysql的performance_schema之前我们有一些需要在强化的知识。分别是threads,instruments,consume......
  • MYSQL 从performance_schema说起,但不止于PS ,sys 到 information_schema?(4)
    接着上期sys库的内容,sys库的监控的内容基本上可以满足大部分对于性能分析的需求,SYS库中的信息可以分为2种数据展示的方式,和10+种的信息展示类别。我们下面来说一说。基于ORACLE的设计理念,SYS库中的信息分为一X$为开头的VIEW的信息和以普通表名为开头的信息。两者的信息内容是相......
  • POSTGRESQL VS MYSQL 到底那个数据库 RDS 技术含量高 ?
    以下内容纯属个人看法云数据库的RDS产品,在传统开源的系列里面大致可以选择的是POSTGRESQL和MYSQL两种,诚然在RDS的里面大部分产品最终的选择还是MYSQL,今天不想讨论产品的量,而是想讨论以下产品的难度,RDS产品在POSTGRESQL和MYSQL两种产品的难度问题。先说结果,POSTGRESQL......
  • MYSQL 8 UNDO 表空间 你了解多少
    UNDOLOG的主要目的是完成事务回滚和MVCC多版本控制中的读取过去事务的问题。UNLOG这里有三个层次的问题 1  undolog存在于undo log 的日志段中2 undolog的日志段存在于undolog的回滚段中3  unloglog的回滚段存在于undo 表空间和全局临时表空间中这里提到为......
  • MYSQL performance_schema 不显示信息 和调整 performance_schema 的配置
    随着问问题的同学越来越多,公众号内部私信回答问题已经很困难了,所以建立了一个群,关于各种数据库的问题都可以,目前主要是POSTGRESQL,MYSQL,MONGODB,POLARDB,REDIS等,最近在某云使用了MYSQLRDS产品,说实话不怎么满意,和他家的其他产品比较我到时更原因使用PG的产品和云原生产品......
  • MYSQL POLARDB 学习系列之 拆解 POLARDB 7 (终结) 失败恢复与可靠性
    随着问问题的同学越来越多,公众号内部私信回答问题已经很困难了,所以建立了一个群,关于各种数据库的问题都可以,目前主要是POSTGRESQL,MYSQL,MONGODB,POLARDB,REDIS,SQLSERVER等,期待你的加入,学习POLARDB已经有3-4个月的时间了,当然大部分还是在理论方面,实际上POLARDB在实际的操......
  • Mysql 8 VS Mariadb 10.6 他们有多不一样 (声译)
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql ,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。首先要说明一点的,Mariadb不是MySQL,虽然他们有同一个历史的渊源,以及曾经类似的底层的代码,功能等等。但是MYSQL<> Mariadb......
  • POSTGRESQL 统计信息与数据查询的准确性与多种统计信息类型
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。自己做了一个统计分析有关的,思维导图之前有一期说过,对于一些特殊的查询中的优化,可以在不建立索引和SQL优化的情况下,我们通过统计......
  • MYSQL 删除数据是非多,8.030 还是有死锁
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。我这个人说问题愿意是感性+理性,首先需要感性认知,我们先来看一个下面的问题,在说这个问题之前,我们先将一些问题说明。1数据库版本......