面试题答案
一键面试监控索引是否被正确使用的方法
- 查询计划分析:
- 理解查询计划是关键。当执行一个查询时,MongoDB会生成一个查询计划,决定如何使用索引来检索数据。
- 可以通过
explain()
方法查看查询计划。例如,对于集合users
,查询{name: "John"}
,可以这样获取查询计划:
db.users.find({name: "John"}).explain()
- 在查询计划输出中,关注
winningPlan.stage
字段。如果是IXSCAN
,表示使用了索引;如果是COLLSCAN
,则表示进行了全表扫描,索引未被使用。
- 慢查询分析:
- 长时间运行的查询可能表明索引未被正确使用。可以通过开启慢查询日志来记录执行时间超过特定阈值(默认为100毫秒)的查询。
- 在配置文件(
mongod.conf
)中设置slowOpThresholdMs
参数来调整阈值。例如,将阈值设置为500毫秒:
operationProfiling: slowOpThresholdMs: 500 mode: "slowOp"
- 开启后,可以通过
db.system.profile.find()
查询系统配置文件集合来查看慢查询记录,分析其中的查询语句及是否正确使用了索引。
相关命令和工具
explain()
命令:- 如上述示例,
explain()
命令用于获取查询计划。它有几种模式:- queryPlanner:默认模式,返回查询优化器生成的查询计划。
- executionStats:除了查询计划,还包含查询执行的统计信息,如扫描的文档数、返回的文档数等。例如:
db.users.find({name: "John"}).explain("executionStats")
- allPlansExecution:返回所有可能的查询计划及其执行统计信息,有助于深入分析查询优化器的决策过程。
- 如上述示例,
- mongotop工具:
mongotop
是MongoDB提供的一个命令行工具,用于监控数据库的读写操作花费的时间。- 它按数据库和集合显示读写操作的时间分布。例如,运行
mongotop
命令后,输出会类似这样:
connected to: 127.0.0.1 insert query update delete getmore command dirty used flushes vsize res faults locked db idx miss % qr|qw ar|aw netIn netOut conn time 0 1442 0 0 0 1501 0.0% 21.6% 0 1.5g 244m 0 admin:0.0% 0|0 0|0 338b 4.44k 1 09:38:40 0 200 0 0 0 200 0.0% 12.5% 0 1.5g 244m 0 test:0.0% 0|0 0|0 128b 4.21k 1 09:38:40
- 通过观察
query
列的时间,如果某个集合的查询时间较长,结合explain()
分析,可判断索引使用情况。
- mongostat工具:
mongostat
也是MongoDB的命令行工具,用于实时监控MongoDB实例的状态。- 它提供了诸如插入、查询、更新、删除操作的速率,以及内存使用、连接数等信息。例如:
connected to: 127.0.0.1 insert query update delete getmore command flushes mapped vsize res faults locked db idx miss % qr|qw ar|aw netIn netOut conn set repl time 0 32 0 0 0 32 0 225.0m 1.5g 244m 0 0.00% 0|0 0|0 3.43k 48.4k 1 test PRIMARY 15:03:43
- 虽然它不直接显示索引使用情况,但通过整体的操作速率等信息,结合慢查询分析,可辅助判断索引是否合理使用。