performance_schema是MySQL中的一个数据库,使用 performance_schema 存储引擎,提供了有关MySQL服务器内部运行的操作上的底层指标,算是对MySQL 服务器的一个性能监控。包括统计最近执行了哪些语句,在执行过程的每个阶段都花费了多长时间,内存的使用情况等等信息
工作机制
程序插栓:在MySQL代码中插入探测代码,以获取想要了解的信息
消费者表:存储关于程序插栓代码信息的表。比如为查询模块添加插桩,相应的消费者表将记录诸如执行总数、未使用索引的次数、花费的时间等信息
当应用程序用户连接到MySQL并执行被测量的插桩指令时,performance_schema将每个检查的调用封装到两个宏中,然后将结果记录在相应的消费者表中
使用
检查当前MySQL版本是否支持
- 查看是否支持performance_schema存储引擎:在INFORMATION_SCHEMA.ENGINES表或show engines语句的输出中查看对应Support字段值是否为YES
- 是否启用performance_schema:performance_schema 在 MySQL 5.6 及之前的版本中默认没有启用,在 MySQL 5.7及之后的版本中才修改为默认启用
相关表
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类型的插栓:
常规SQL语句:
存储在events_statements_current、events_statements_history和events_statements_history_long表中。通过这三张表可以获取到SQL执行的相关信息,进而分析SQL瓶颈、实例读写性能等等
其中可以参考的需要优化查询的指标的列如下所示:
语句剖析:
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、错误等
- 本文标题:《高性能MySQL》读书笔记performanceSchema
- 创建时间:2023-06-28 15:20:47
- 本文链接:2023/06/28/Schema/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!