Part01-基础概念与理论知识
1.1 MySQL性能模式概述
MySQL性能模式(Performance Schema)是MySQL 5.5及以上版本引入的一个特性,用于收集数据库服务器的性能指标。它提供了一种低开销的方式来监控MySQL服务器的执行情况,帮助DBA和开发人员识别性能瓶颈。风哥教程参考MySQL官方文档MySQL Performance Schema。
1.2 MySQL性能模式表分类
Performance Schema包含多个表,这些表可以分为以下几类:
- 事件记录表:记录各类事件的详细信息,如等待事件、语句事件等
- 事件聚合表:对事件记录进行聚合统计
- 配置表:控制Performance Schema的行为
- 元数据表:提供Performance Schema自身的元数据信息
1.3 MySQL性能模式配置参数
SHOW VARIABLES LIKE ‘performance_schema%’;
| Variable_name | Value |
+——————————————————–+——-+
| performance_schema | ON |
| performance_schema_accounts_size | 100 |
| performance_schema_digests_size | 10000 |
| performance_schema_events_stages_history_long_size | 10000 |
| performance_schema_events_stages_history_size | 10 |
| performance_schema_events_statements_history_long_size | 10000 |
| performance_schema_events_statements_history_size | 10 |
| performance_schema_events_waits_history_long_size | 10000 |
| performance_schema_events_waits_history_size | 10 |
| performance_schema_hosts_size | 100 |
| performance_schema_max_cond_classes | 80 |
| performance_schema_max_cond_instances | 1000 |
| performance_schema_max_file_classes | 50 |
| performance_schema_max_file_handles | 32768 |
| performance_schema_max_file_instances | 10000 |
| performance_schema_max_mutex_classes | 200 |
| performance_schema_max_mutex_instances | 100000|
| performance_schema_max_rwlock_classes | 30 |
| performance_schema_max_rwlock_instances | 100000|
| performance_schema_max_socket_classes | 10 |
| performance_schema_max_socket_instances | 1000 |
| performance_schema_max_stage_classes | 150 |
| performance_schema_max_statement_classes | 168 |
| performance_schema_max_thread_classes | 50 |
| performance_schema_max_thread_instances | 1000 |
| performance_schema_session_connect_attrs_size | 512 |
| performance_schema_setup_actors_size | 100 |
| performance_schema_setup_objects_size | 100 |
| performance_schema_users_size | 100 |
+——————————————————–+——-+
Part02-生产环境规划与建议
2.1 MySQL性能模式启用建议
- 在生产环境中,建议启用Performance Schema,但需要根据服务器配置和性能需求进行合理配置
- 对于高并发的生产环境,可能需要调整某些参数以减少开销
- 定期清理Performance Schema中的历史数据,避免占用过多内存
2.2 MySQL性能模式开销评估
Performance Schema的开销主要体现在以下几个方面:
- 内存使用:需要存储事件记录和聚合统计信息
- CPU使用:需要收集和处理事件数据
- 磁盘I/O:当启用文件事件收集时会产生额外的I/O
学习交流加群风哥微信: itpux-com
2.3 MySQL性能模式监控策略
制定合理的监控策略:
- 根据监控目标选择需要启用的事件类型
- 设置合理的历史记录大小
- 定期分析Performance Schema数据,及时发现性能问题
- 结合其他监控工具,如MySQL Enterprise Monitor或第三方监控工具
Part03-生产环境项目实施方案
3.1 MySQL性能模式表结构详解
Performance Schema包含多个表,以下是一些重要的表:
3.1.1 事件记录表
- events_waits_current:当前正在执行的等待事件
- events_waits_history:最近的等待事件历史
- events_waits_history_long:更长的等待事件历史
- events_statements_current:当前正在执行的语句事件
- events_statements_history:最近的语句事件历史
- events_statements_history_long:更长的语句事件历史
- events_stages_current:当前正在执行的阶段事件
- events_stages_history:最近的阶段事件历史
- events_stages_history_long:更长的阶段事件历史
3.1.2 事件聚合表
- events_waits_summary_by_thread_by_event_name:按线程和事件名称聚合的等待事件
- events_waits_summary_by_instance:按实例聚合的等待事件
- events_statements_summary_by_thread_by_event_name:按线程和事件名称聚合的语句事件
- events_statements_summary_by_digest:按语句摘要聚合的语句事件
- events_stages_summary_by_thread_by_event_name:按线程和事件名称聚合的阶段事件
3.1.3 配置表
- setup_consumers:控制哪些事件被收集
- setup_instruments:控制哪些仪器被启用
- setup_timers:设置事件计时的精度
- setup_actors:控制哪些用户和主机的事件被收集
- setup_objects:控制哪些对象的事件被收集
3.2 MySQL性能模式表查询方法
SELECT * FROM performance_schema.events_statements_current;
# 查询最近的语句历史
SELECT * FROM performance_schema.events_statements_history;
# 查询语句摘要统计
SELECT * FROM performance_schema.events_statements_summary_by_digest ORDER BY sum_timer_wait DESC LIMIT 10;
# 查询等待事件统计
SELECT * FROM performance_schema.events_waits_summary_by_instance ORDER BY sum_timer_wait DESC LIMIT 10;
3.3 MySQL性能模式表监控配置
UPDATE performance_schema.setup_consumers SET ENABLED = ‘YES’;
# 启用所有仪器
UPDATE performance_schema.setup_instruments SET ENABLED = ‘YES’, TIMED = ‘YES’;
# 配置只收集特定用户的事件
INSERT INTO performance_schema.setup_actors (HOST, USER, ROLE, ENABLED, HISTORY) VALUES (‘%’, ‘fgedu’, ‘%’, ‘YES’, ‘YES’);
# 配置只收集特定表的事件
INSERT INTO performance_schema.setup_objects (OBJECT_TYPE, OBJECT_SCHEMA, OBJECT_NAME, ENABLED, TIMED) VALUES (‘TABLE’, ‘fgedudb’, ‘fgedu_users’, ‘YES’, ‘YES’);
Part04-生产案例与实战讲解
4.1 MySQL性能模式表查询实战
案例1:查找执行时间最长的SQL语句
SELECT
DIGEST_TEXT,
COUNT_STAR,
SUM_TIMER_WAIT,
AVG_TIMER_WAIT,
MAX_TIMER_WAIT
FROM
performance_schema.events_statements_summary_by_digest
ORDER BY
SUM_TIMER_WAIT DESC
LIMIT 5;
| DIGEST_TEXT | COUNT_STAR | SUM_TIMER_WAIT | AVG_TIMER_WAIT | MAX_TIMER_WAIT |
+———————————————+————+—————-+—————-+—————-+
| SELECT * FROM fgedu_users WHERE age > ? | 10 | 25200000000000 | 2520000000000 | 3100000000000 |
| SELECT * FROM fgedu_orders WHERE create_time BETWEEN ? AND ? | 5 | 9350000000000 | 1870000000000 | 2200000000000 |
| UPDATE fgedu_users SET name = ? WHERE id = ? | 15 | 3200000000000 | 213333333333 | 450000000000 |
| INSERT INTO fgedu_orders (user_id, amount) VALUES (?, ?) | 20 | 1800000000000 | 90000000000 | 120000000000 |
| SELECT * FROM fgedu_products WHERE category_id = ? | 8 | 1200000000000 | 150000000000 | 200000000000 |
+———————————————+————+—————-+—————-+—————-+
案例2:查找最常见的等待事件
SELECT
EVENT_NAME,
COUNT_STAR,
SUM_TIMER_WAIT,
AVG_TIMER_WAIT
FROM
performance_schema.events_waits_summary_global_by_event_name
WHERE
SUM_TIMER_WAIT > 0
ORDER BY
SUM_TIMER_WAIT DESC
LIMIT 10;
| EVENT_NAME | COUNT_STAR | SUM_TIMER_WAIT | AVG_TIMER_WAIT |
+—————————————-+————+—————-+—————-+
| wait/io/file/innodb/innodb_data_file | 1200 | 15000000000000 | 12500000000 |
| wait/io/file/innodb/innodb_log_file | 800 | 8000000000000 | 10000000000 |
| wait/io/file/sql/binlog | 300 | 3000000000000 | 10000000000 |
| wait/io/file/myisam/kfile | 200 | 1200000000000 | 6000000000 |
| wait/io/file/myisam/dfile | 150 | 900000000000 | 6000000000 |
| wait/synch/mutex/innodb/row_lock_mutex | 5000 | 800000000000 | 160000000 |
| wait/synch/mutex/innodb/buf_pool_mutex | 3000 | 600000000000 | 200000000 |
| wait/synch/sxlock/innodb/index_tree_sx | 2000 | 400000000000 | 200000000 |
| wait/io/file/sql/FRM | 100 | 300000000000 | 3000000000 |
| wait/io/file/sql/par_file | 50 | 150000000000 | 3000000000 |
+—————————————-+————+—————-+—————-+
4.2 MySQL性能模式表监控案例
案例:监控连接数和线程状态
SELECT
USER,
HOST,
COUNT(*) AS connection_count
FROM
performance_schema.threads
WHERE
PROCESSLIST_ID IS NOT NULL
GROUP BY
USER, HOST
ORDER BY
connection_count DESC;
| USER | HOST | connection_count |
+——+—————+—————–+
| fgedu | 192.168.1.100 | 50 |
| root | localhost | 5 |
| app | 192.168.1.101 | 20 |
+——+—————+—————–+
4.3 MySQL性能模式表优化技巧
# performance_schema_optimize.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# 优化Performance Schema配置
mysql -u root -p”password” << EOF
# 只启用必要的消费者
UPDATE performance_schema.setup_consumers SET ENABLED = 'NO';
UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME IN (
'events_statements_current',
'events_statements_history',
'events_statements_history_long',
'events_statements_summary_by_thread_by_event_name',
'events_statements_summary_by_digest',
'events_waits_current',
'events_waits_history',
'events_waits_summary_by_instance'
);
# 只启用必要的仪器
UPDATE performance_schema.setup_instruments SET ENABLED = 'NO', TIMED = 'NO';
UPDATE performance_schema.setup_instruments SET ENABLED = 'YES', TIMED = 'YES' WHERE NAME LIKE 'wait/io/%';
UPDATE performance_schema.setup_instruments SET ENABLED = 'YES', TIMED = 'YES' WHERE NAME LIKE 'statement/%';
# 清理历史数据
TRUNCATE TABLE performance_schema.events_statements_history;
TRUNCATE TABLE performance_schema.events_statements_history_long;
TRUNCATE TABLE performance_schema.events_waits_history;
TRUNCATE TABLE performance_schema.events_waits_history_long;
TRUNCATE TABLE performance_schema.events_stages_history;
TRUNCATE TABLE performance_schema.events_stages_history_long;
EOF
Part05-风哥经验总结与分享
5.1 MySQL性能模式表使用最佳实践
- 根据监控需求启用必要的消费者和仪器,避免启用所有选项
- 定期清理历史数据,保持Performance Schema的高效运行
- 结合sys模式使用,获得更直观的性能分析结果
- 设置合理的历史记录大小,避免占用过多内存
- 定期分析Performance Schema数据,及时发现性能问题
5.2 MySQL性能模式表监控经验
监控经验分享:
- 使用Performance Schema监控SQL语句执行情况,找出慢查询
- 监控等待事件,识别I/O瓶颈和锁竞争
- 结合其他监控工具,如pt-query-digest,获得更全面的性能分析
- 建立性能基准,定期对比性能数据,发现性能退化
学习交流加群风哥QQ113257174
5.3 MySQL性能模式表常见问题
- 问题:Performance Schema占用过多内存
解决方案:调整历史记录大小,只启用必要的消费者和仪器 - 问题:Performance Schema导致性能下降
解决方案:减少启用的仪器数量,只监控必要的事件 - 问题:Performance Schema数据不准确
解决方案:确保启用了正确的仪器和消费者,定期清理历史数据 - 问题:Performance Schema表查询缓慢
解决方案:限制查询结果集大小,使用合适的索引
更多视频教程www.fgedu.net.cn
更多学习教程公众号风哥教程itpux_com
from MySQL:www.itpux.com
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
