慢查询分析
内置分析器
MongoDB提供了内置的查询分析器(profiler),通过db.setProfilingLevel(n,m)命令可以开启分析器功能。
分析器级别设置
- 级别0(关闭分析):
db.setProfilingLevel(0) - 级别1(记录慢查询):
db.setProfilingLevel(1, m)- m为毫秒阈值 - 级别2(记录所有操作):
db.setProfilingLevel(2)
使用示例
// 设置记录慢于50ms的查询
db.setProfilingLevel(1, 50)
// 查看分析数据
db.system.profile.find().sort({ts:-1}).limit(10)
数据库性能问题分析
-
应用程序设计不合理
- 频繁的短连接
- 未优化的SQL查询
- N+1查询问题
-
不正确的数据类型
- 字段类型与实际数据不匹配
-
硬件配置问题
- CPU、内存、磁盘I/O不足
-
缺少索引
- 频繁执行全表扫描
EXPLAIN 基础概念
输出字段
- id:查询中SELECT操作的顺序号
- type:表的访问方式(最好到最差:system > const > eq_ref > ref > range > index > ALL)
- possible_keys:可能使用的索引
- key:实际使用的索引
- rows:预估需要检查的行数
常见优化场景
- 全表扫描(type=ALL):添加合适索引
- 文件排序(Using filesort):为ORDER BY列添加索引
- 临时表(Using temporary):优化GROUP BY查询
- 索引覆盖(Using index):良好情况