MySQL5.5 performance_schema的介绍
mysql 5.5 版本 新增了一个性能优化的引擎: PERFORMANCE_SCHEMA这个功能默认是关闭的: 需要设置参数: performance_schema 才可以启动该功能,这个参数是静态参数,只能写在my.cnf 中 不能动态修改。 先看看有什么东西吧:
mysql> use performance_schema; Database changed mysql> show tables ;
+----------------------------------------------+ | Tables_in_performance_schema | +----------------------------------------------+ | cond_instances | | events_waits_current | | events_waits_history | | events_waits_history_long | | events_waits_summary_by_instance | | events_waits_summary_by_thread_by_event_name | | events_waits_summary_global_by_event_name | | file_instances | | file_summary_by_event_name | | file_summary_by_instance | | mutex_instances | | performance_timers | | rwlock_instances | | setup_consumers | | setup_instruments | | setup_timers | | threads | +----------------------------------------------+ 17 rows in set (0.00 sec)
这里的数据表分为几类:
1) setup table : 设置表,配置监控选项。
2) current events table : 记录当前那些thread 正在发生什么事情。
3) history table 发生的各种事件的历史记录表
4) summary table 对各种事件的统计表
5) 杂项表,乱七八糟表。
setup 表:
mysql> SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES -> WHERE TABLE_SCHEMA = 'performance_schema' -> AND TABLE_NAME LIKE 'setup%'; +-------------------+ | TABLE_NAME | +-------------------+ | setup_consumers | | setup_instruments | | setup_timers | +-------------------+
setup_consumers 描述各种事件
setup_instruments 描述这个数据库下的表名以及是否开启监控。
setup_timers 描述 监控选项已经采样频率的时间间隔
这个要多说一点 目前 performance-schema 只支持 'wait' 时间的监控,代码树上 wait/ 下的函数都可以监控到。
文档上说了只有 'wait' 事件的检测,有没有其他的选项呢?
看看源代码:
static row_setup_timers all_setup_timers_data[COUNT_SETUP_TIMERS]= { {
{ C_STRING_WITH_LEN(\}, &wait_timer } };
THR_LOCK table_setup_timers::m_table_lock;
int table_setup_timers::update_row_values(TABLE *table, const unsigned char *, unsigned char *, Field **fields) {
Field *f; longlong value;
DBUG_ASSERT(m_row);
for (; (f= *fields) ; fields++) {
if (bitmap_is_set(table->write_set, f->field_index)) {
switch(f->field_index) {
case 0: /* NAME */
my_error(ER_WRONG_PERFSCHEMA_USAGE, MYF(0)); return HA_ERR_WRONG_COMMAND; case 1: /* TIMER_NAME */ value= get_field_enum(f);
if ((value >= FIRST_TIMER_NAME) && (value <= LAST_TIMER_NAME)) *(m_row->m_timer_name_ptr)= (enum_timer_name) value; else
return HA_ERR_WRONG_COMMAND; break; default:
DBUG_ASSERT(false); } } }
return 0; }
代码里写死了,只有 'wait' 一个值,不排除以后的版本会增加新的关键字,但至少目前就只有一个啦。 并且这个表的name 字段是不允许修改的的。 下面的修改的方法里没有做任何处理,涉及到name字段的修改,直接报错。
mysql> SELECT * FROM setup_timers; +------+------------+ | NAME | TIMER_NAME | +------+------------+ | wait | CYCLE | +------+------------+
只有 timer_name 可以update 这是一个enum 字段。
性能事件表:
mysql> SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES -> WHERE TABLE_SCHEMA = 'performance_schema' -> AND TABLE_NAME LIKE '%current'; +----------------------+ | TABLE_NAME | +----------------------+ | events_waits_current | +----------------------+
记录当前正在发生的等待事件,这个表是只读的表,不能update ,delete ,但是可以truncate
具体字段是什么意思就自己去查doc 了,这里不说了。
性能历史表:
mysql> SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES -> WHERE TABLE_SCHEMA = 'performance_schema'
-> AND (TABLE_NAME LIKE '%history' OR TABLE_NAME LIKE '%history_long'); +---------------------------+ | TABLE_NAME | +---------------------------+ | events_waits_history | | events_waits_history_long | +---------------------------+
这些表与前面的性能表的结构是一致的, history 表只保留每个线程(thread) 的最近的10个事件, history_long 记录最近的10000个事件。
新事件如表,如果旧表满了,就会丢弃旧的数据,标准的先进先出(FIFO) 这俩表也是只读表,只能truncate
事件汇总表:
mysql> SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES -> WHERE TABLE_SCHEMA = 'performance_schema' -> AND TABLE_NAME LIKE '%summary%'; +----------------------------------------------+ | TABLE_NAME | +----------------------------------------------+ | events_waits_summary_by_instance | | events_waits_summary_by_thread_by_event_name | | events_waits_summary_global_by_event_name | | file_summary_by_event_name | | file_summary_by_instance |
相关推荐: