数据库内核月报 - 2015 / 11-MySQL · 特性分析 · Statement Digest

本文涉及的产品
云原生数据库 PolarDB 分布式版,标准版 2核8GB
RDS PostgreSQL Serverless,0.5-4RCU 50GB 3个月
推荐场景:
对影评进行热评分析
云数据库 RDS SQL Server,基础系列 2核4GB
简介:

背景

在对数据库进行性能调优的时候,除了参数、配置的调整以外,SQL调优也是重要的手段,同时也是收益最大的一环。
当DBA对业务库进行sql调优的时候,如何做到有的放矢,投入产出受益最大?足够详细的SQL性能统计无疑是最重要的信息。

下面我们先来看下不同数据库提供的sql性能统计信息:

Oracle的sql性能统计

Oracle可以通过直接查询v$表得到,下面的columns列表是我们常用的一些统计:

select sql_id,
     sql_text,
     sql_fulltext,
     sharable_mem,
     persistent_mem,
     runtime_mem,
     sorts,
     fetches,
     executions,
     parse_calls,
     disk_reads,
     direct_writes,
     buffer_gets,
     application_wait_time,
     concurrency_wait_time,
     cluster_wait_time,
     user_io_wait_time,
     rows_processed,
     cpu_time,
     elapsed_time
from v$sql_area

这里边包括了几类统计,SQL内存使用的统计、parse的统计、物理/逻辑IO的统计、cpu时间、等待时间等时间统计。

DBA可以根据这些统计信息进行有针对性的调优:

  1. CPU调优: 如果当前数据库性能CPU是瓶颈,可以通过order by cpu_time,查询出来top CPU的SQL进行调优;
  2. IO调优: 可以根据buffer_gets, disk_reads,user_io_wait_time 查询top IO的SQL进行调优;
  3. 锁争用: 可以根据concurrency_wait_time,cluster_wait_time查询top lock的SQL进行调优。

MySQL的SQL性能统计

1. 通过show profiles来查询统计信息
在MySQL 5.6版本之前,还保留着show profiles的方式,后续版本逐步被performance_schema来替换了。
使用方法如下:

mysql> SET profiling=1;
mysql> select 1, sleep(1);
mysql> show profile cpu, block io for query 1;
+----------------------+----------+----------+------------+--------------+---------------+
| Status               | Duration | CPU_user | CPU_system | Block_ops_in | Block_ops_out |
+----------------------+----------+----------+------------+--------------+---------------+
| starting             | 0.000100 |     NULL |       NULL |         NULL |          NULL |
| checking permissions | 0.000014 |     NULL |       NULL |         NULL |          NULL |
| Opening tables       | 0.000024 |     NULL |       NULL |         NULL |          NULL |
| init                 | 0.000020 |     NULL |       NULL |         NULL |          NULL |
| optimizing           | 0.000008 |     NULL |       NULL |         NULL |          NULL |
| executing            | 0.000022 |     NULL |       NULL |         NULL |          NULL |
| User sleep           | 1.000090 |     NULL |       NULL |         NULL |          NULL |
| end                  | 0.000021 |     NULL |       NULL |         NULL |          NULL |
| query end            | 0.000009 |     NULL |       NULL |         NULL |          NULL |
| closing tables       | 0.000010 |     NULL |       NULL |         NULL |          NULL |
| freeing items        | 0.000055 |     NULL |       NULL |         NULL |          NULL |
| logging slow query   | 0.000008 |     NULL |       NULL |         NULL |          NULL |
| cleaning up          | 0.000012 |     NULL |       NULL |         NULL |          NULL |
+----------------------+----------+----------+------------+--------------+---------------+
13 rows in set (0.00 sec)

show profile的语法如下:

        SHOW PROFILE [type [, type] … ]  
            [FOR QUERY n]  
            [LIMIT row_count [OFFSET offset]]  
          
        type:  
            ALL  
          | BLOCK IO  
          | CONTEXT SWITCHES  
          | CPU  
      | IPC  
          | MEMORY  
          | PAGE FAULTS  
          | SOURCE  
          | SWAPS  

从结果集可以看到每一块操作的CPU时间,block IO情况。
但这种适合拿单个SQL进行分析,使用上的便捷性比较差。

2. 通过performance_schema的digest统计
MySQL之前的版本不支持绑定变量,导致SQL语句太多,相同业务的SQL汇总统计比较麻烦。
从MySQL 5.6开始,在performance_schema中支持了对SQL statement的digest进行统计。
performance_schema.events_statements_summary_by_digest表根据digest进行汇总统计,DBA可以直接访问这个内存表得到SQL的统计信息。

首先,需要打开performance_schema,然后系统就会自动为SQL statement生成digest,并记录统计信息。
例如:

mysql> select 1, sleep(1);
+---+----------+
| 1 | sleep(1) |
+---+----------+
| 1 |        0 |
+---+----------+
1 row in set (1.00 sec)
mysql> select * from events_statements_summary_by_digest\G;
*************************** 1. row ***************************
                SCHEMA_NAME: performance_schema
                     DIGEST: bb80cc862a205b471ce0f0ff2605a9a0
                DIGEST_TEXT: SELECT ? , `sleep` (?)
                 COUNT_STAR: 1
             SUM_TIMER_WAIT: 1000577972000
             MIN_TIMER_WAIT: 1000577972000
             AVG_TIMER_WAIT: 1000577972000
             MAX_TIMER_WAIT: 1000577972000
              SUM_LOCK_TIME: 0
                 SUM_ERRORS: 0
               SUM_WARNINGS: 0
          SUM_ROWS_AFFECTED: 0
              SUM_ROWS_SENT: 1
          SUM_ROWS_EXAMINED: 0
SUM_CREATED_TMP_DISK_TABLES: 0
     SUM_CREATED_TMP_TABLES: 0
       SUM_SELECT_FULL_JOIN: 0
SUM_SELECT_FULL_RANGE_JOIN: 0
           SUM_SELECT_RANGE: 0
     SUM_SELECT_RANGE_CHECK: 0
            SUM_SELECT_SCAN: 0
      SUM_SORT_MERGE_PASSES: 0
             SUM_SORT_RANGE: 0
              SUM_SORT_ROWS: 0
              SUM_SORT_SCAN: 0
          SUM_NO_INDEX_USED: 0
     SUM_NO_GOOD_INDEX_USED: 0
                 FIRST_SEEN: 2015-11-06 11:15:52
                  LAST_SEEN: 2015-11-06 11:15:52
2 rows in set (0.00 sec)

DBA可用通过这个表的统计信息,来有的放矢的进行SQL调优。

然而performance_schema中digest的限制:

  1. 必须打开performance_schema的所有功能才行,但performance_schema全部打开会对性能产生一些影响;
  2. events_statements_summary_by_digest 表默认有200个的最大限制,但从MySQL 5.5开始,可以通过调整performance_schema_digests_size来修改。但如果表满了的话,新来的digest的统计信息,会被全部汇总到一个digest=NULL的记录中;
  3. 对于每一个SQL statement,performance_schema会生成一个最大1024bytes的digest_text,超过的会被截断。

针对以上的一些限制,MySQL5.7最新GA的版本,进行了一些改进。

另外,针对限制2 Percona有一些工具pt-query-digest, 并建立一些digest历史表,进行分析,有兴趣的可以使用尝试一下。可以参考: mysql-query-digest-with-performance-schema

MySQL 5.7 performance_schema digest的改进

  1. SQL statement digest生成功能不必和performance_schema绑定,digest的功能的源代码主要是这两个文件:PFS_digest.cc和PFS_digest.h。这两个文件从存储引擎目录storage/perfschema/ 移到了server目录sql/下;
  2. 从MySQL 5.7.6开始,digest的最大长度由固定的1024bytes,变成了可变大小,由参数performance_schema_max_sql_text_length在系统启动的时候初始化。

总结

用户可以针对performance_schema提供的digest的功能,根据需求进行一些开发和扩展,比如定期历史保存、建立SQL性能基线、或者更进一步如果能修改源码,可以为digest增加更多的merics等。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
26天前
|
存储 关系型数据库 MySQL
MySQL 8.0特性-自增变量的持久化
【11月更文挑战第8天】在 MySQL 8.0 之前,自增变量(`AUTO_INCREMENT`)的行为在服务器重启后可能会发生变化,导致意外结果。MySQL 8.0 引入了自增变量的持久化特性,将其信息存储在数据字典中,确保重启后的一致性。这提高了开发和管理的稳定性,减少了主键冲突和数据不一致的风险。默认情况下,MySQL 8.0 启用了这一特性,但在升级时需注意行为变化。
|
6天前
|
SQL 关系型数据库 MySQL
MySQL导入.sql文件后数据库乱码问题
本文分析了导入.sql文件后数据库备注出现乱码的原因,包括字符集不匹配、备注内容编码问题及MySQL版本或配置问题,并提供了详细的解决步骤,如检查和统一字符集设置、修改客户端连接方式、检查MySQL配置等,确保导入过程顺利。
|
26天前
|
SQL 关系型数据库 MySQL
12 PHP配置数据库MySQL
路老师分享了PHP操作MySQL数据库的方法,包括安装并连接MySQL服务器、选择数据库、执行SQL语句(如插入、更新、删除和查询),以及将结果集返回到数组。通过具体示例代码,详细介绍了每一步的操作流程,帮助读者快速入门PHP与MySQL的交互。
34 1
|
28天前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
39 4
|
23天前
|
运维 关系型数据库 MySQL
安装MySQL8数据库
本文介绍了MySQL的不同版本及其特点,并详细描述了如何通过Yum源安装MySQL 8.4社区版,包括配置Yum源、安装MySQL、启动服务、设置开机自启动、修改root用户密码以及设置远程登录等步骤。最后还提供了测试连接的方法。适用于初学者和运维人员。
142 0
|
2月前
|
存储 SQL 关系型数据库
Mysql学习笔记(二):数据库命令行代码总结
这篇文章是关于MySQL数据库命令行操作的总结,包括登录、退出、查看时间与版本、数据库和数据表的基本操作(如创建、删除、查看)、数据的增删改查等。它还涉及了如何通过SQL语句进行条件查询、模糊查询、范围查询和限制查询,以及如何进行表结构的修改。这些内容对于初学者来说非常实用,是学习MySQL数据库管理的基础。
134 6
|
2月前
|
存储 关系型数据库 MySQL
Mysql(4)—数据库索引
数据库索引是用于提高数据检索效率的数据结构,类似于书籍中的索引。它允许用户快速找到数据,而无需扫描整个表。MySQL中的索引可以显著提升查询速度,使数据库操作更加高效。索引的发展经历了从无索引、简单索引到B-树、哈希索引、位图索引、全文索引等多个阶段。
69 3
Mysql(4)—数据库索引
|
1月前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
192 1
|
1月前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
100 2
|
1月前
|
存储 关系型数据库 MySQL
MySQL vs. PostgreSQL:选择适合你的开源数据库
在众多开源数据库中,MySQL和PostgreSQL无疑是最受欢迎的两个。它们都有着强大的功能、广泛的社区支持和丰富的生态系统。然而,它们在设计理念、性能特点、功能特性等方面存在着显著的差异。本文将从这三个方面对MySQL和PostgreSQL进行比较,以帮助您选择更适合您需求的开源数据库。
137 4

相关产品

  • 云数据库 RDS MySQL 版