《高性能MySQL》读书笔记performanceSchema
dd

performance_schema是MySQL中的一个数据库,使用 performance_schema 存储引擎,提供了有关MySQL服务器内部运行的操作上的底层指标,算是对MySQL 服务器的一个性能监控。包括统计最近执行了哪些语句,在执行过程的每个阶段都花费了多长时间,内存的使用情况等等信息

工作机制

程序插栓:在MySQL代码中插入探测代码,以获取想要了解的信息

消费者表:存储关于程序插栓代码信息的表。比如为查询模块添加插桩,相应的消费者表将记录诸如执行总数、未使用索引的次数、花费的时间等信息

image

当应用程序用户连接到MySQL并执行被测量的插桩指令时,performance_schema将每个检查的调用封装到两个宏中,然后将结果记录在相应的消费者表中

使用

检查当前MySQL版本是否支持

  1. 查看是否支持performance_schema存储引擎:在INFORMATION_SCHEMA.ENGINES表或show engines语句的输出中查看对应Support字段值是否为YES

image

  1. 是否启用performance_schema:performance_schema 在 MySQL 5.6 及之前的版本中默认没有启用,在 MySQL 5.7及之后的版本中才修改为默认启用

image

相关表

setup_instruments:所有支持的插栓列表

消费者表:包含100多个表,可根据用途大致分类:

  • 当前和历史数据:
    • *_current:当前服务器上进行中的事件
    • *_history:每个线程最近完成的10个事件
    • *_history_long:每个线程最近完成的10000个事件
    • events_waits:底层服务器等待
    • events_statements:SQL查询语句
    • events_stages:配置文件信息,比如创建临时表或发送数据
    • events_transactions:事务
  • 汇总表和摘要
    • 汇总表:保存有关该表建议的内容的聚合信息。如memory_summary_by_thread_by_event_name表保存了用户连接或任何后台线程的每个MySQL线程的聚合内存使用情况
    • 摘要:通过删除查询中的变量来聚合查询的方法,使Performance Schema不需要单独保留查询的每个变体
  • 实例表:指对象实例,用于MySQL安装程序。例如file_instances表包含文件名和访问这些文件的线程数
  • 设置表:用于performance_schema的运行时设置
  • 其他…

检查SQL语句

需要启用statement类型的插栓:

image

常规SQL语句:

存储在events_statements_current、events_statements_history和events_statements_history_long表中。通过这三张表可以获取到SQL执行的相关信息,进而分析SQL瓶颈、实例读写性能等等

其中可以参考的需要优化查询的指标的列如下所示:

image

image

语句剖析:

events_stages_[current|history|history_long]表包含剖析信息,例如MySQL在创建临时表、更新或等待锁时花费了多少时间

检查内存使用情况

需要启用memory类的插桩

Performance Schema将内存使用统计信息存储在摘要表中,摘要表的名称以memory_summary_前缀开头。内存使用聚合统计

弊端

  • 内存消耗:Performance Schema收集的数据保存在内存中。performance_schema中的一些表支持自动伸缩,这意味着它们在启动时分配最小数量的内存,并根据需要调整其大小。然而,一旦分配了内存,即使禁用了特定的插桩并截断了表,也不会再释放该内存,除非重启实例
  • CPU消耗:每个插桩指令的调用都会再添加两个宏调用,以将数据存储在performance_schema中。这意味着插桩越多,CPU的使用率就越高
  • 只在特定的插栓和用户启用后才收集数据:如果在禁用所有插桩的情况下启动服务器,然后决定检测内存使用情况,则无法知道全局缓冲区(如InnoDB缓冲池)分配的确切数量,因为在启用内存插桩之前已分配了该缓冲区

建议

应该启用Performance Schema,按需动态地启用插桩和消费者表,通过它们提供的数据可以解决可能存在的任何问题——查询性能、锁定、磁盘I/O、错误等