mongodb慢查询基础知识

发布时间 2023-12-03 16:34:24作者: Myuniverse

慢查询基础知识

介绍

如何定位 MongoDB 数据库的慢查询,我想应该是很多刚使用 MongoDB 数据库的朋友最想知道的问题。通过慢查询的定位,可以辅助对 MongoDB 中的 collection 进行优化。

MongoDB 数据库的慢查询数据其实存放在一个数据库集合 ( collection ) 中(system.profile),如果你不主动创建 system.profile 这个集合,那这个集合就固定1M大小,当慢查询记录超过1M,就会将历史数据覆盖,循环使用,所以在这里需要根据业务实际情况设置集合大小。

在 MongoDB 中慢查询功能(Profiling)设置有三个级别,分别代表如下含义:

0:代表关闭,不收集任何慢查询
1:收集慢查询数据,默认收集超过100毫秒的慢查询
2:收集任何操作记录数据
可以通过在 MongoDB 中执行如下命令查看当前数据库的配置,需要特别注意的是,如果你在某一数据库中调整了该设置,那么该操作只对该数据库有效,其他数据库仍需要单独设置:

use test
'switched to db test'
db.getProfilingStatus()
{ was: 1, slowms: 1000, sampleRate: 1, ok: 1 }

开启方式

通过配置文件启用

  • 编辑mongodb配置文件,并且在配置文件中添加以下内容
# 设置是否开启慢查询
profile=1  # 0:代表关闭,不收集任何慢查询;1:收集慢查询数据,默认收集超过100毫秒的慢查询;2:收集任何操作记录数据

# 设置慢查询阈值为100ms
slowms=100  # 视情况而定
  • 重启mongodb
sudo service mongod restart

通过shell开启

命令:db.setProfilingLevel()

db.setProfilingLevel(<level>, <options>);

Parameters
参数:level
Type: integer

0	profiler已关闭,并且不收集任何数据。这是默认的profiler级别。
1	profiler收集花费的时间超过slowms值的数据。
2	profiler收集所有操作的数据。

参数:options
Type: document or integer
Description:可选的,接受document or integer。如果将整数值作为options参数而不是文档作为参数传递,则该值将分配给slowms。

查看是否开启慢查询

执行 db.getProfilingStatus() 查询数据库,返回结果是 was: 0 代表 MongoDB 没有开启慢查询功能;对应的如果不是 0 则表示开启了慢查询监控功能。

db.setProfilingLevel(2)
{ was: 1, slowms: 500, sampleRate: 1, ok: 1 }
db.getProfilingStatus()
{ was: 2, slowms: 500, sampleRate: 1, ok: 1 }

慢查询日志查看

  1. 如何查询慢查询日志
    假设上面我们已经开启了慢查询监控功能,那在数据库使用过程中,会将 1000 ms 以上的执行查询进行记录,下面我们来看一下如何查询这些慢查询。

3.1 慢查询日志查看

  • 查询最近的 10 个慢查询日志 (运行时间大于等于 8000 毫秒)
db.system.profile.find({"millis":{$gte:8000}}).limit(10).sort( { ts : -1 } ).pretty()
  • 查询大于 100 秒的日志
db.system.profile.find( { millis : { $gt : 100000 } } ).pretty()
  • 查询时间从 2023-11-03 15 点整到 2023-11-03 15点30分 之间的日志
db.system.profile.find({ts : {$gt: new ISODate("2023-11-03T07:00:00Z"),$lt: new ISODate("2023-11-03T07:30:00Z")}}).pretty()