程序插桩(instrument)。程序插桩在MySQL代码中插入探测代码,以获取我们想了解的信息。
消费者表(consumer),指的是存储关于程序插桩代码信息的表。如果我们为查询模块添加插桩,相应的消费者表将记录诸如执行总数、未使用索引的次数、花费的时间等信息。
当应用程序用户连接到MySQL并执行被测量的插桩指令时,performance_schema将每个检查的调用封装到两个宏中,然后将结果记录在相应的消费者表中。这里的要点是,启用插桩会调用额外的代码,这意味着插桩会消耗CPU资源。
setup_instruments表包含所有支持的插桩的列表。所有插桩的名称都由用斜杠分隔的部件组成。下面的例子展示了插桩的命名规则:
插桩名称的最左边部分表示插桩的类型。因此,statement表示插桩类型是statement,wait表示插桩类型是wait,以此类推。
汇总表保存有关该表所建议的内容的聚合信息。例如,memory_summary_by_thread_by_event_name表保存了用户连接或任何后台线程的每个MySQL线程的聚合内存使用情况。
摘要是一种通过删除查询中的变量来聚合查询的方法,变量可以展示为"?"。
实例是指对象实例,用于MySQL安装程序。例如,file_instances表包含文件名和访问这些文件的线程数。
设置表用于performance_schema的运行时设置。
还有一些表的名称没有遵循严格的模式。例如,metadata_locks表保存关于元数据锁的数据。
Performance Schema收集的数据保存在内存中。然而,一旦分配了内存,即使禁用了特定的插桩并截断了表,也不会再释放该内存。
sys schema,它全部基于performance_schema上的视图和存储例程组成。它的设计目的是让performance_schema体验更加流畅,它本身并不存储任何数据。
MySQL服务端是多线程软件。它的每个组件都使用线程。可以是后台线程,例如,由主线程或存储引擎创建的,也可以是为用户连接创建的前台线程。每个线程至少有两个唯一标识符:一个是操作系统线程ID,另一个是MySQL内部线程ID(THREAD_ID)。每个前台线程都有一个指定的PROCESSLIST_ID:连接标识符。
THREAD_ID不等于PROCESSLIST_ID。
Performance Schema的部分设置只能在服务器启动时更改:比如启用或禁用Performance Schema本身以及与内存使用和数据收集的限制相关的变量。Performance Schema插桩和消费者表则可以被动态启用或禁用。
三种方式:
三种方式:
Performance Schema将数据存储在使用PERFORMANCE_SCHEMA引擎的表中,该引擎将数据存储在内存中。默认情况下,某些performance_schema表会自动调整大小,其他的则有固定数量的行。可以通过更改启动变量来调整这些选项。变量的名称遵循p erformance_schema_object_[size|instances|classes|length|handles]的模式,其中对象要么是消费者表,要么是设置表,要么是特定事件的插桩实例
要启用语句检测,需要启用statement类型的插桩。Performance Schema将语句指标存储在events_statements_current、events_statements_history和events_statements_history_long表中。
events_stages_[current|history|history_long]表包含剖析信息,例如MySQL在创建临时表、更新或等待锁时花费了多少时间。要启用剖析,需要启用上述消费者表以及匹配’stage/%'模式的插桩。启用后可以找到类似“查询执行的哪个阶段花费了非常长的时间”等问题的答案。
元数据锁用于保护数据库对象定义不被修改。共享元数据锁会阻止那些更改数据库对象定义的语句,比如ALTER TABLE或CREATE INDEX,直到锁被释放为止。
事务执行期间会一直持有元数据锁。多语句事务的使用会使故障排除变得更加困难。很容易搞清楚哪个语句在等待元数据锁:DDL语句会隐式提交事务,因此它们是新事务中唯一的语句,并且可以在进程列表中发现它们处于“waiting for a metadata lock”状态。但是在进程列表中可能找不到持有元数据锁的语句,这些语句已经执行完成,但是包含这些语句的事务还没有提交。
performance_schema中的metadata_locks表包含关于当前由不同线程设置的锁的信息,以及处于等待状态的锁请求信息。要启用元数据锁监测,需要启用wait/lock/meta-data/sql/mdl插桩。
要在performance_schema中启用内存监测,请启用memory类的插桩。
Performance Schema将内存使用统计信息存储在摘要表中,摘要表的名称以memory_summary_前缀开头。内存使用聚合统计。
变量分为服务器变量、状态变量和用户变量。
全局变量值被存储在表global_variables中。状态变量可以按用户账户、主机、用户和线程聚合。最有趣的是线程聚合,因为它允许你快速识别哪个连接在服务器上造成了大部分资源压力
除了特定错误信息,performance_schema还提供摘要表,可以按用户、主机、账户、线程和错误号聚合错误信息。
请注意,默认情况下,如果Performance_schema被设为默认数据库,则不会跟踪对它的查询。如果需要检查对performance_schema的查询,则需要首先更新setup_actors表。一旦setup_actors表被更新,就可以使用所有的插桩。