一、什么是慢查询?
慢查询是指执行时间超过预设阈值的数据库查询操作。在数据库系统中,通常会设置一个时间阈值(如MySQL默认是10秒),当查询执行时间超过这个阈值时,就会被记录为慢查询。
二、慢查询造成的主要原因
-
索引问题
缺少必要的索引
使用了不合适的索引
索引失效(如对索引列使用函数、隐式类型转换等) -
SQL语句问题
复杂的多表连接
使用SELECT * 查询不必要的数据
子查询嵌套过深
使用了OR条件导致索引失效
大量数据排序(ORDER BY)或分组(GROUP BY) -
数据库设计问题
表结构设计不合理
字段类型选择不当
没有合理的分表分库 -
数据量问题
单表数据量过大
查询返回的结果集过大 -
系统资源问题
服务器内存不足
磁盘I/O瓶颈
CPU资源紧张
数据库连接数过多
例如:
5.1确认是否为单pod问题
domain:“域名” and request_time>6 | select distinct"TAG.pod_name" limit 10000
5.2是否是某些url的问题
domain:“域名” and request_time>6 | select distinct"request_url" limit 1000000 -
锁竞争
行锁、表锁等锁等待
死锁问题
三、慢查询的排查方法
-
开启慢查询日志
SET GLOBAL slow_query_log = ‘ON’;
SET GLOBAL long_query_time = 2; – 设置慢查询阈值为2秒
SET GLOBAL slow_query_log_file = ‘/var/log/mysql/mysql-slow.log’; -
使用EXPLAIN分析查询
EXPLAIN SELECT * FROM users WHERE age > 30;
分析关键指标:
type:查询类型(最好达到ref或range级别)
possible_keys:可能使用的索引
key:实际使用的索引
rows:预估需要检查的行数
Extra:额外信息 -
使用性能分析工具
MySQL的SHOW PROFILE
pt-query-digest分析慢查询日志
Percona Toolkit中的各种工具
数据库监控系统(如Prometheus+Grafana) -
监控数据库状态
SHOW STATUS LIKE ‘Slow_queries’;
SHOW PROCESSLIST; – 查看当前执行的查询
四、慢查询的解决方案
-
优化索引
为常用查询条件添加合适的索引
使用复合索引时注意最左前缀原则
避免索引失效的情况
定期分析索引使用情况,删除冗余索引 -
优化SQL语句
避免SELECT *,只查询需要的字段
优化JOIN操作,确保关联字段有索引
将复杂的子查询改为JOIN
使用LIMIT限制返回行数
避免在WHERE子句中对字段使用函数 -
数据库设计优化
合理设计表结构,遵循范式
对大型表进行分表分库
考虑使用读写分离架构
对历史数据进行归档 -
系统配置优化
调整数据库缓冲区大小(如innodb_buffer_pool_size)
优化磁盘I/O配置
增加服务器内存
调整并发连接数设置 -
应用层优化
实现查询缓存
使用连接池管理数据库连接
批量操作代替循环单条操作
合理使用事务,避免长事务 -
定期维护
定期执行ANALYZE TABLE更新统计信息
定期优化表
监控并清理长时间运行的查询
122

被折叠的 条评论
为什么被折叠?



