慢查询分析

内置分析器

MongoDB提供了内置的查询分析器(profiler),通过db.setProfilingLevel(n,m)命令可以开启分析器功能。

分析器级别设置

  1. 级别0(关闭分析)db.setProfilingLevel(0)
  2. 级别1(记录慢查询)db.setProfilingLevel(1, m) - m为毫秒阈值
  3. 级别2(记录所有操作)db.setProfilingLevel(2)

使用示例

// 设置记录慢于50ms的查询
db.setProfilingLevel(1, 50)

// 查看分析数据
db.system.profile.find().sort({ts:-1}).limit(10)

数据库性能问题分析

  1. 应用程序设计不合理

    • 频繁的短连接
    • 未优化的SQL查询
    • N+1查询问题
  2. 不正确的数据类型

    • 字段类型与实际数据不匹配
  3. 硬件配置问题

    • CPU、内存、磁盘I/O不足
  4. 缺少索引

    • 频繁执行全表扫描

EXPLAIN 基础概念

输出字段

  1. id:查询中SELECT操作的顺序号
  2. type:表的访问方式(最好到最差:system > const > eq_ref > ref > range > index > ALL)
  3. possible_keys:可能使用的索引
  4. key:实际使用的索引
  5. rows:预估需要检查的行数

常见优化场景

  1. 全表扫描(type=ALL):添加合适索引
  2. 文件排序(Using filesort):为ORDER BY列添加索引
  3. 临时表(Using temporary):优化GROUP BY查询
  4. 索引覆盖(Using index):良好情况