Mongodb 一个人怎样才能发现“一个”呢;无用的;索引?
我有一个包含很多索引的MongoDB集合 删除很少使用的索引会带来什么好处吗 是否有任何方法或工具可以告诉我(以数字形式)索引的使用频率 编辑:我使用的是2.6.4版Mongodb 一个人怎样才能发现“一个”呢;无用的;索引?,mongodb,indexing,Mongodb,Indexing,我有一个包含很多索引的MongoDB集合 删除很少使用的索引会带来什么好处吗 是否有任何方法或工具可以告诉我(以数字形式)索引的使用频率 编辑:我使用的是2.6.4版 EDIT2:我现在使用的是3.0.3版对,所以我会这样做 首先,您需要一个特定集合的所有索引的列表(这将逐个集合完成)。假设我们正在监视用户集合,以查看哪些索引是无用的 因此,我运行了一个db.user.getIndexes(),这将产生一个可解析的JSON输出(您可以通过客户端的command()运行它,也可以与脚本集成) 现在
EDIT2:我现在使用的是3.0.3版对,所以我会这样做 首先,您需要一个特定集合的所有索引的列表(这将逐个集合完成)。假设我们正在监视
用户
集合,以查看哪些索引是无用的
因此,我运行了一个db.user.getIndexes()
,这将产生一个可解析的JSON输出(您可以通过客户端的command()
运行它,也可以与脚本集成)
现在您有了一个索引列表。这只是理解哪些查询使用哪些索引的一个例子。如果这个索引根本没有命中,你就知道它是无用的
现在,您需要使用explain()
运行每个查询。从该输出中,您可以判断使用了哪个索引,并将其与从getIndexes()
获得的索引进行匹配
下面是一个示例输出:
> db.user.find({religion:1}).explain()
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "meetapp.user",
"indexFilterSet" : false,
"parsedQuery" : {
"religion" : {
"$eq" : 1
}
},
"winningPlan" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"religion" : NumberLong(1)
},
"indexName" : "religion_1",
"isMultiKey" : false,
"direction" : "forward",
"indexBounds" : {
"religion" : [
"[1.0, 1.0]"
]
}
}
},
"rejectedPlans" : [ ]
},
"serverInfo" : {
"host" : "ip-172-30-0-35",
"port" : 27017,
"version" : "3.0.0",
"gitVersion" : "a841fd6394365954886924a35076691b4d149168"
},
"ok" : 1
}
queryPlanner
字段将使用一组规则,您需要为它们发现和编写规则,但第一个规则足够简单
正如您所看到的:获胜计划(在winningPlan
中)是一个单一的(可以是多个,请记住,您需要对这些内容进行编码)IXSCAN
(索引扫描),所用索引的键模式是:
"keyPattern" : {
"religion" : NumberLong(1)
},
很好,现在我们可以匹配getIndexes()
的键输出:
to告诉我们,宗教
索引不是无用的,实际上是被使用的
不幸的是,这是我能看到的最好的方式。过去,MongoDB有一个索引统计表,记录索引被命中的次数,但似乎数据已经被删除了
因此,您只需冲洗并对每个集合重复此过程,直到删除了无用的索引
当然,另一种方法是删除所有索引,然后在测试查询时重新添加索引。但如果在生产中确实需要这样做,这可能会很糟糕
另一方面:解决这个问题的最好方法是根本不使用它
通过在活动记录中使用索引功能,我可以更轻松地实现这一点。每隔一段时间,我就会(从PHP)运行类似的东西:
/yii index/rebuild
,它基本上会遍历我的活动记录模型,检测哪些索引我不再使用,哪些索引已经从我的应用程序中删除,然后依次删除。当然,它会创建新的索引。我已经去过了。但我真的不明白这对我有什么帮助。嗯,这不是一个简单的方法,即使你自己编写代码,而不是手动检查每个查询并将索引标记为“有用”,然后删除所有不有用的marked@Sammaye我同意。但是我怎样才能看到它的用法呢?好的,我们越来越近了。explain()中的哪个值告诉我索引的使用频率?谢谢。至少我可以找出使用了hwat索引。你还记得吗,哪个版本能够提供索引命中次数的索引统计数据?@PhilippSander我想大概是1.6,我真的建议不要降级。如果他们删除了它(似乎是这样的),他们这样做是有充分的理由的,很可能是某些条款使统计数据变得无用
{
"v" : 1,
"key" : {
"religion" : NumberLong(1)
},
"name" : "religion_1",
"ns" : "meetapp.user"
},