
我们在其中一个 mongodb 集合上积累了大量索引,如果可能的话,最好删除其中一些。但是,很难知道应用程序正在使用哪些索引,哪些索引(如果有的话)现在已经过时。
是否有人知道任何工具/技术可以分析正在使用的索引?
编辑:Mongo v3.0.5
答案1
不幸的是,MongoDB 3.0 没有直接识别未使用索引的方法。
MongoDB 3.2 确实通过引入 $indexStats 对此进行了改进,它显示索引访问情况: https://docs.mongodb.com/manual/reference/operator/aggregation/indexStats/
一些建议:
尝试识别任何可能互为前缀的索引,因为这些索引可能是多余的。请记住,索引的顺序可能很重要
正如 Jacob 所提到的,使用 explain plan 可以帮助确定查询是否正在使用索引。 PlanCache.getPlansByQuery() 将在此基础上进行扩展,显示数据库当前针对特定查询模式缓存了哪些查询计划: https://docs.mongodb.com/v3.0/reference/method/PlanCache.getPlansByQuery/#PlanCache.getPlansByQuery
答案2
MongoDB 3.2 之后,您可以使用 $indexStats 了解哪些索引正在使用以及使用程度如何。我写了一篇关于此的博客文章 -https://scalegrid.io/blog/how-to-find-unused-indexes-in-mongodb/
答案3
您可以对单个查询使用 query.explain() 来返回该查询的查询计划。您可以在此处进一步了解。 https://docs.mongodb.com/manual/reference/method/cursor.explain/
您可能还想了解其他事项:
在 serverStatus 的输出中:
scanned
scanAndOrder
在 collStats 的输出中:
totalIndexSize
indexSizes
在 dbStats 的输出中:
dbStats.indexes
dbStats.indexSize