内容简介:本文主要介绍MySQL存储过程参数与返回值的相关知识,包括参数类型、使用方法和最佳实践等内容。风哥教程参考MySQL官方文档MySQL Performance Tuning、MySQL Server Administration。
Part01-基础概念与理论知识
1.1 性能调优的重要性
MySQL性能调优是数据库运维的核心任务,直接影响应用的响应速度和用户体验。
1.2 性能指标
评估MySQL性能的关键指标: 01 更多视频教程www.fgedu.net.cn
1. 响应时间
– 查询执行时间
– 事务响应时间
– 连接响应时间
2. 吞吐量
– QPS (Queries Per Second)
– TPS (Transactions Per Second)
– 并发连接数
3. 资源利用率
– CPU使用率
– 内存使用率
– 磁盘I/O
– 网络流量
4. 缓存效率
– 缓冲池命中率
– 键缓冲区命中率
– 查询缓存命中率
Part02-生产环境规划与建议
2.1 Performance Schema
Performance Schema提供了详细的性能数据: 02 学习交流加群风哥微信: itpux-com
1. 启用Performance Schema
mysql> SHOW VARIABLES LIKE ‘performance_schema’;
输出示例:
+——————–+——-+
| Variable_name | Value |
+——————–+——-+
| performance_schema | ON |
+——————–+——-+
2. 查看语句执行统计
mysql> SELECT DIGEST_TEXT, COUNT_STAR, SUM_TIMER_WAIT/1000000000000 AS total_time_sec
FROM performance_schema.events_statements_summary_by_digest
ORDER BY SUM_TIMER_WAIT DESC LIMIT 10;
输出示例:
+———————+————+—————-+
| DIGEST_TEXT | COUNT_STAR | total_time_sec |
+———————+————+—————-+
| SELECT * FROM users | 10000 | 50.00 |
| INSERT INTO users | 5000 | 25.00 |
| UPDATE users SET … | 2000 | 10.00 |
+———————+————+—————-+
3. 查看等待事件
mysql> SELECT EVENT_NAME, COUNT_STAR, SUM_TIMER_WAIT/1000000000000 AS total_time_sec
FROM performance_schema.events_waits_summary_global_by_event_name
ORDER BY SUM_TIMER_WAIT DESC LIMIT 10;
输出示例:
+—————————+————+—————-+
| EVENT_NAME | COUNT_STAR | total_time_sec |
+—————————+————+—————-+
| io/file/innodb/innodb_log | 50000 | 100.00 |
| io/file/innodb/innodb_data | 30000 | 80.00 |
| lock/sleep | 20000 | 50.00 |
+—————————+————+—————-+
2.2 Sys Schema
Sys Schema提供了更友好的性能视图: 03 学习交流加群风哥QQ113257174
1. 查看慢查询
mysql> SELECT * FROM sys.statements_with_runtimes_in_95th_percentile LIMIT 10;
输出示例:
+———————+——+————+————+————+————+—————-+————+—————-+—————-+————-+
| query | db | full_scan | exec_count | err_count | warn_count | total_latency | max_latency | avg_latency |
lock_latency | rows_sent |
+———————+——+————+————+————+————+—————-+————+—————-+—————-+————-+
| SELECT * FROM users | test | 1 | 10000 | 0 | 0 | 50.00 s | 1.00 s | 5.00 ms | 10.00 s | 100000 |
+———————+——+————+————+————+————+—————-+————+—————-+—————-+————-+
2. 查看表空间使用
mysql> SELECT * FROM sys.schema_table_statistics_with_buffer LIMIT 10;
输出示例:
+—————+————+————+————+————–+—————-+—————-+————-+
| table_schema | table_name | rows | avg_row_len| data_length | index_length | total_length | buffer_size |
+—————+————+————+————+————–+—————-+—————-+————-+
| test | users | 100000 | 100 | 10000000 | 5000000 | 15000000 | 1000000 |
+—————+————+————+————+————–+—————-+—————-+————-+
Part03-生产环境项目实施方案
3.1 EXPLAIN分析
使用EXPLAIN分析查询执行计划: 04 风哥提示:
1. 基本EXPLAIN
mysql> EXPLAIN SELECT * FROM users WHERE name = ‘John Doe’;
输出示例:
+—-+————-+——-+————+——+—————+——+———+——+——+———-+————-+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered |
Extra |
+—-+————-+——-+————+——+—————+——+———+——+——+———-+————-+
| 1 | SIMPLE | users | NULL | ALL | NULL | NULL | NULL | NULL | 1000 | 10.00 | Using where |
+—-+————-+——-+————+——+—————+——+———+——+——+———-+————-+
2. 添加索引后
mysql> ALTER TABLE users ADD INDEX idx_name (name);
输出示例:
Query OK, 0 rows affected (0.05 sec)
mysql> EXPLAIN SELECT * FROM users WHERE name = ‘John Doe’;
输出示例:
+—-+————-+——-+————+——+—————+———-+———+——-+——+———-+——-+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered |
Extra |
+—-+————-+——-+————+——+—————+———-+———+——-+——+———-+——-+
| 1 | SIMPLE | users | NULL | ref | idx_name | idx_name | 1023 | const | 1 | 100.00 | NULL |
+—-+————-+——-+————+——+—————+———-+———+——-+——+———-+——-+
3.2 查询重写
重写查询以提高性能: 05更多学习教程公众号风哥教程itpux_com
1. 避免SELECT *
— 不好的查询
SELECT * FROM users WHERE name = ‘John Doe’;
— 好的查询
SELECT id, name, email FROM users WHERE name = ‘John Doe’;
2. 使用LIMIT限制结果
— 不好的查询
SELECT * FROM users;
— 好的查询
SELECT * FROM users LIMIT 100;
3. 使用JOIN替代子查询
— 不好的查询
SELECT * FROM users WHERE id IN (SELECT user_id FROM orders WHERE amount > 100);
— 好的查询
SELECT u.* FROM users u JOIN orders o ON u.id = o.user_id WHERE o.amount > 100;
4. 使用索引列进行排序
— 不好的查询
SELECT * FROM users ORDER BY name;
— 好的查询
ALTER TABLE users ADD INDEX idx_name (name);
SELECT * FROM users ORDER BY name;
Part04-生产案例与实战讲解
4.1 索引设计
设计合理的索引结构:
1. 创建索引
mysql> ALTER TABLE users ADD INDEX idx_email (email);
输出示例:
Query OK, 0 rows affected (0.05 sec)
2. 创建复合索引
mysql> ALTER TABLE users ADD INDEX idx_name_email (name, email);
输出示例:
Query OK, 0 rows affected (0.05 sec)
3. 创建唯一索引
mysql> ALTER TABLE users ADD UNIQUE INDEX idx_email (email);
输出示例:
Query OK, 0 rows affected (0.05 sec)
4. 查看索引
mysql> SHOW INDEX FROM users;
输出示例:
+——-+————+—————-+————–+————-+———–+————-+———-+——–+——+————+———+—————+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed |
Null | Index_type | Comment | Index_comment |
+——-+————+—————-+————–+————-+———–+————-+———-+——–+——+————+———+—————+
| users | 0 | PRIMARY | 1 | id | A | 100000 | NULL | NULL | | BTREE | | |
| users | 1 | idx_email | 1 | email | A | 100000 | NULL | NULL | YES | BTREE | | |
| users | 1 | idx_name_email | 1 | name | A | 10000 | NULL | NULL | YES | BTREE | | |
| users | 1 | idx_name_email | 2 | email | A | 100000 | NULL | NULL | YES | BTREE | | |
+——-+————+—————-+————–+————-+———–+————-+———-+——–+——+————+———+—————+
4.2 索引维护
定期维护索引以保持性能:
1. 分析表
mysql> ANALYZE TABLE users;
输出示例:
+———–+———+———-+———-+
| Table | Op | Msg_type | Msg_text |
+———–+———+———-+———-+
| test.users| analyze | status | OK |
+———–+———+———-+———-+
2. 优化表
mysql> OPTIMIZE TABLE users;
输出示例:
+———–+———-+———-+———-+
| Table | Op | Msg_type | Msg_text |
+———–+———-+———-+———-+
| test.users| optimize | note | Table does not support optimize, doing recreate + analyze instead |
| test.users| optimize | status | OK |
+———–+———-+———-+———-+
3. 删除未使用的索引
mysql> ALTER TABLE users DROP INDEX idx_unused;
输出示例:
Query OK, 0 rows affected (0.05 sec)
Part05-风哥经验总结与分享
5.1 内存参数
优化内存相关参数:
1. InnoDB缓冲池
mysql> SHOW VARIABLES LIKE ‘innodb_buffer_pool_size’;
输出示例:
+————————-+————+
| Variable_name | Value |
+————————-+————+
| innodb_buffer_pool_size | 134217728 |
+————————-+————+
2. 调整缓冲池大小
vim /etc/my.cnf
[mysqld]
innodb_buffer_pool_size = 8G
3. 重启MySQL
systemctl restart mysqld
4. 验证配置
mysql> SHOW VARIABLES LIKE ‘innodb_buffer_pool_size’;
输出示例:
+————————-+————+
| Variable_name | Value |
+————————-+————+
| innodb_buffer_pool_size | 8589934592 |
+————————-+————+
5.2 连接参数
优化连接相关参数: 06 from mysql视频:www.itpux.com
1. 查看连接参数
mysql> SHOW VARIABLES LIKE ‘max_connections’;
输出示例:
+—————–+——-+
| Variable_name | Value |
+—————–+——-+
| max_connections | 151 |
+—————–+——-+
2. 调整最大连接数
vim /etc/my.cnf
[mysqld]
max_connections = 500
3. 重启MySQL
systemctl restart mysqld
4. 验证配置
mysql> SHOW VARIABLES LIKE ‘max_connections’;
输出示例:
+—————–+——-+
| Variable_name | Value |
+—————–+——-+
| max_connections | 500 |
+—————–+——-+
6. 实战案例
6.1 慢查询优化
优化慢查询:
1. 查看慢查询日志
mysql> SHOW VARIABLES LIKE ‘slow_query_log%’;
输出示例:
+———————+———————————-+
| Variable_name | Value |
+———————+———————————-+
| slow_query_log | ON |
| slow_query_log_file | /var/log/mysql/mysql-slow.log |
+———————+———————————-+
2. 分析慢查询
tail -f /var/log/mysql/mysql-slow.log
输出示例:
# Time: 2026-04-01T10:00:00.000000Z
# User@Host: root[root] @ localhost [] Id: 10
# Query_time: 5.000000 Lock_time: 0.000000 Rows_sent: 1000 Rows_examined: 1000000
SET timestamp=1711948800;
SELECT * FROM users WHERE name LIKE ‘%John%’;
3. 优化查询
— 添加索引
mysql> ALTER TABLE users ADD INDEX idx_name (name);
— 使用全文索引
mysql> ALTER TABLE users ADD FULLTEXT INDEX ft_name (name);
— 使用全文搜索
mysql> SELECT * FROM users WHERE MATCH(name) AGAINST(‘John’ IN NATURAL LANGUAGE MODE);
4. 验证优化效果
mysql> SELECT * FROM users WHERE name LIKE ‘%John%’;
输出示例:
+—-+———-+——————+
| id | name | email |
+—-+———-+——————+
| 1 | John Doe | john@fgedu.net.cn |
+—-+———-+——————+
1 row in set (0.01 sec)
6.2 高负载优化
优化高负载下的性能:
1. 查看当前负载
mysql> SHOW PROCESSLIST;
输出示例:
+—-+——+———–+——+———+——+——-+——————+
| Id | User | Host | db | Command | Time | State | Info |
+—-+——+———–+——+———+——+——-+——————+
| 10 | root | localhost | test | Query | 5 | Sending data | SELECT * FROM users |
+—-+——+———–+——+———+——+——-+——————+
2. 分析瓶颈
mysql> SELECT * FROM sys.statements_with_runtimes_in_95th_percentile LIMIT 10;
输出示例:
+———————+——+————+————+————+————+—————-+————+—————-+—————-+————-+
| query | db | full_scan | exec_count | err_count | warn_count | total_latency | max_latency | avg_latency |
lock_latency | rows_sent |
+———————+——+————+————+————+————+—————-+————+—————-+—————-+————-+
| SELECT * FROM users | test | 1 | 10000 | 0 | 0 | 50.00 s | 1.00 s | 5.00 ms | 10.00 s | 100000 |
+———————+——+————+————+————+————+—————-+————+—————-+—————-+————-+
3. 优化参数
vim /etc/my.cnf
[mysqld]
innodb_buffer_pool_size = 16G
innodb_log_file_size = 1G
innodb_flush_log_at_trx_commit = 2
max_connections = 1000
query_cache_size = 0
4. 重启MySQL
systemctl restart mysqld
5. 验证优化效果
mysql> SHOW STATUS LIKE ‘Threads_running’;
输出示例:
+—————–+——-+
| Variable_name | Value |
+—————–+——-+
| Threads_running | 5 |
+—————–+——-+
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
