千金良方:MySQL性能优化金字塔法则
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

5.2 启动时配置

performance_schema中的配置是保存在内存中的,易丢失。也就是说,保存在performance_schema配置表(本章后续内容会讲到)中的配置项在MySQL实例停止时会全部丢失。所以,需要在MySQL的配置文件中使用启动选项来持久化配置项,让MySQL每次重启时都自动加载配置项,而不需要再重新配置。

5.2.1 启动选项

performance_schema有哪些启动选项呢?我们可以通过如下命令进行查看。

[root@localhost ~]# mysqld --verbose --help |grep performance-schema |grep -v '\-\-' |sed\'1d' |sed '/[0-9]\+/d'
......
performance-schema-consumer-events-stages-current FALSE
performance-schema-consumer-events-stages-history FALSE
performance-schema-consumer-events-stages-history-long FALSE
performance-schema-consumer-events-statements-current TRUE
performance-schema-consumer-events-statements-history TRUE
performance-schema-consumer-events-statements-history-long FALSE
performance-schema-consumer-events-transactions-current FALSE
performance-schema-consumer-events-transactions-history FALSE
performance-schema-consumer-events-transactions-history-long FALSE
performance-schema-consumer-events-waits-current FALSE
performance-schema-consumer-events-waits-history FALSE
performance-schema-consumer-events-waits-history-long FALSE
performance-schema-consumer-global-instrumentation TRUE
performance-schema-consumer-statements-digest TRUE
performance-schema-consumer-thread-instrumentation TRUE
performance-schema-instrument
......

下面将对一些启动选项进行简单描述(这些启动选项用于指定consumers和instruments配置项在MySQL启动时是否跟随打开。之所以叫作启动选项,是因为它们在mysqld启动时就需要通过命令行指定,或者在my.cnf中指定,启动之后通过show variables命令无法查看,因为它们不属于system variables)。

(1)performance_schema_consumer_events_statements_current=TRUE

是否在MySQL Server启动时就开启events_statements_current表的记录功能(该表记录当前的语句事件信息),启动之后也可以在setup_consumers表中使用UPDATE语句动态更新setup_consumers配置表中的events_statements_current配置项,默认值为TRUE。

(2)performance_schema_consumer_events_statements_history=TRUE

与performance_schema_consumer_events_statements_current选项类似,但该选项用于配置是否记录语句事件短历史信息,默认值为TRUE。

(3)performance_schema_consumer_events_stages_history_long=FALSE

与performance_schema_consumer_events_statements_current选项类似,但该选项用于配置是否记录语句事件长历史信息,默认值为FALSE。

除statement(语句)事件之外,它还支持wait(等待)事件、stage(阶段)事件、transaction(事务)事件,它们与语句事件一样都有三个启动项要分别进行配置,但等待事件默认未启用,如果需要在MySQL Server启动时一同启动,则通常要写进my.cnf配置文件中。

(4)performance_schema_consumer_global_instrumentation=TRUE

是否在MySQL Server启动时就开启全局表(如:mutex_instances、rwlock_instances、cond_instances、file_instances、users、hostsaccounts、socket_summary_by_event_name、file_summary_by_instance等大部分全局对象计数统计和事件汇总统计信息表)的记录功能,启动之后也可以在setup_consumers表中使用UPDATE语句动态更新全局配置项。默认值为TRUE。

(5)performance_schema_consumer_statements_digest=TRUE

是否在MySQL Server启动时就开启events_statements_summary_by_digest表的记录功能,启动之后也可以在setup_consumers表中使用UPDATE语句动态更新digest配置项。默认值为TRUE。

(6)performance_schema_consumer_thread_instrumentation=TRUE

是否在MySQL Server启动时就开启events_xxx_summary_by_yyy_by_event_name表的记录功能,启动之后也可以在setup_consumers表中使用UPDATE语句动态更新线程配置项。默认值为TRUE。

(7)performance_schema_instrument[=name]

是否在MySQL Server启动时就启用某些采集器。由于instruments配置项多达数千个,所以该配置项支持key-value模式,还支持使用“%”进行通配等。

# [=name]可以指定为具体的instruments名称(但是如果有多个instruments需要指定时,就需要使用该选项多次),还可以使用通配符,可以指定instruments相同的前缀+通配符,也可以使用%代表所有的instruments
## 指定开启单个instruments
--performance-schema-instrument='instrument_name=value'
## 使用通配符指定开启多个instruments
--performance-schema-instrument='wait/synch/cond/%=COUNTED'
## 开关所有的instruments
--performance-schema-instrument='%=ON'
--performance-schema-instrument='%=OFF'

注意:这些启动选项生效的前提是设置performance_schema=ON。另外,虽然无法使用show variables语句查看这些启动选项,但是我们可以通过setup_instruments和setup_consumers表查询这些选项指定的值。

5.2.2 system variables

可以使用show variables语句查看与performance_schema相关的system variables,这些system variables用于限定consumers表的存储限制,它们都是只读变量,需要在MySQL启动之前就设置好这些变量的值。

mysql> show variables like '%performance_schema%';
+--------------------------------------------------------+--------+
| Variable_name                                        | Value   |
+--------------------------------------------------------+--------+
| performance_schema                                   | ON      |
| performance_schema_accounts_size                      | -1      |
| performance_schema_digests_size                       | 10000   |
| performance_schema_error_size                         | 4367    |
| performance_schema_events_stages_history_long_size    | 10000   |
| performance_schema_events_stages_history_size         | 10      |
.....
42 rows in set(0.01 sec)

下面我们将对几个需要关注的system variables(以下称为变量)进行简单解释(其中大部分变量是-1值,代表会自动调整,不需要太多关注。另外,大于-1值的变量在大多数时候也够用,如果无特殊需求,不建议调整,调整这些参数会增加内存使用量)。

(1)performance_schema=ON

控制performance_schema功能的开关,要使用MySQL的performance_schema,需要在mysqld启动时开启,以启用事件收集功能。

该参数在MySQL 5.7.x之前支持performance_schema的版本中默认关闭,从MySQL 5.7.x版本开始默认开启。

注意:如果mysqld在初始化performance_schema时发现无法分配任何相关的内部缓冲区,则将自动禁用performance_schema,并将performance_schema设置为OFF。

(2)performance_schema_digests_size=10000

控制events_statements_summary_by_digest表中的最大行数。如果产生的语句摘要信息超过此最大值,便无法继续存入该表,此时performance_schema会增加状态变量。

(3)performance_schema_events_statements_history_long_size=10000

控制events_statements_history_long表中的最大行数。该参数控制所有会话在events_statements_history_long表中能够存放的总事件记录数,超过这个限制之后,最早的记录将被覆盖。

它是全局变量、只读变量,取整型值,从MySQL 5.6.3版本开始引入。

● 在MySQL 5.6.x版本中,5.6.5及之前的版本默认值为10000,5.6.6及之后的版本默认值为-1。在通常情况下,自动计算的值都是10000。

● 在MySQL 5.7.x版本中,默认值为-1。在通常情况下,自动计算的值都是10000。

(4)performance_schema_events_statements_history_size=10

控制events_statements_history表中单个线程(会话)的最大行数。该参数控制单个会话在events_statements_history表中能够存放的事件记录数,超过这个限制之后,单个会话最早的记录将被覆盖。

它是全局变量、只读变量,取整型值,从MySQL 5.6.3版本开始引入。

● 在MySQL 5.6.x版本中,5.6.5及之前的版本默认值为10,5.6.6及之后的版本默认值为-1。在通常情况下,自动计算的值都是10。

● 在MySQL 5.7.x版本中,默认值为-1。在通常情况下,自动计算的值都是10。

除statement(语句)事件之外,它还支持wait(等待)事件、stage(阶段)事件、transaction(事务)事件,它们与语句事件一样都有三个参数要分别进行存储限制配置,有兴趣的读者请自行研究,这里不再赘述。

(5)performance_schema_max_digest_length=1024

控制标准化形式的SQL语句文本在存入performance_schema时的限制长度。该变量与max_digest_length变量相关(关于max_digest_length变量的含义,请读者自行查阅相关资料)。

它是全局变量、只读变量,取整型值,取值范围为0~1048576,默认值为1024字节。在MySQL 5.6.26和5.7.8版本中引入了该变量。

(6)performance_schema_max_sql_text_length=1024

控制存入events_statements_current、events_statements_history和events_statements_history_long语句事件表中的SQL_TEXT列的最大SQL语句长度字节数。超出系统变量performance_schema_max_sql_text_length的部分将被丢弃,不会记录。一般情况下不需要调整该参数,除非被截断的部分与其他SQL语句比起来有很大差异。

它是全局变量、只读变量,取整型值,取值范围为0~1048576,默认值为1024字节。从MySQL 5.7.6版本开始引入。

降低系统变量performance_schema_max_sql_text_length的值可以减少内存使用,但如果在汇总的SQL语句中被截断部分有较大差异,则会导致没有办法再对这些有较大差异的SQL语句进行区分。增加该系统变量的值会增加内存使用,但对于汇总的SQL语句来讲,可以更精准地区分不同的部分。