面试题答案
一键面试分析现有索引是否合理
- 使用
explain()
方法:explain()
方法可以提供查询执行计划的详细信息。例如,对于一个简单的查询:
db.collection.find({ field: "value" }).explain("executionStats")
- 查看
executionStats
中的totalDocsExamined
和totalKeysExamined
字段。如果totalDocsExamined
远大于totalKeysExamined
,说明索引可能在发挥作用,但如果totalDocsExamined
非常大,接近集合中的文档总数,可能索引不合理或未使用索引。
- 分析慢查询日志:
- 开启慢查询日志,通过分析日志中查询的执行时间和查询条件,找出可能存在索引问题的查询。例如,在
mongod.conf
中设置slowOpThresholdMs
为较低的值(如100,单位毫秒),这样执行时间超过100毫秒的查询就会被记录到日志中。然后分析这些查询,看是否可以通过调整索引来优化。
- 开启慢查询日志,通过分析日志中查询的执行时间和查询条件,找出可能存在索引问题的查询。例如,在
- 查看索引使用统计信息:
- 使用
db.collection.stats()
命令查看集合的统计信息,其中包含索引相关的信息,如索引大小等。如果某个索引占用空间过大,但在查询中很少使用,可能需要考虑是否保留该索引。
- 使用
查询性能低下时优化索引的步骤
-
添加索引:
- 例如,有一个集合
users
,经常按照age
和name
字段进行查询:
db.users.createIndex({ age: 1, name: 1 })
- 这里的
1
表示升序索引,通过创建复合索引,可以加快按这两个字段的查询速度。
- 例如,有一个集合
-
删除不必要的索引:
- 如果发现某些索引很少被使用,可以使用
db.collection.dropIndex({ indexName: 1 })
命令删除索引。例如,有一个索引unnecessaryIndex
,确定其很少使用后:
db.collection.dropIndex({ unnecessaryIndex: 1 })
- 这样可以减少索引维护的开销和磁盘空间占用。
- 如果发现某些索引很少被使用,可以使用
-
调整索引结构:
- 比如对于复合索引,调整字段顺序可能会影响查询性能。如果查询经常先按
name
过滤,再按age
过滤,那么可以考虑将复合索引改为{ name: 1, age: 1 }
。
- 比如对于复合索引,调整字段顺序可能会影响查询性能。如果查询经常先按
-
重建索引:
- 有时索引可能会碎片化,影响性能。可以使用
db.collection.reIndex()
命令重建索引,以优化索引结构。例如:
db.users.reIndex()
- 这会删除原索引并重新创建,可能会提升查询性能。
- 有时索引可能会碎片化,影响性能。可以使用