Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 一个人怎样才能发现“一个”呢;无用的;索引?_Mongodb_Indexing - Fatal编程技术网

Mongodb 一个人怎样才能发现“一个”呢;无用的;索引?

Mongodb 一个人怎样才能发现“一个”呢;无用的;索引?,mongodb,indexing,Mongodb,Indexing,我有一个包含很多索引的MongoDB集合 删除很少使用的索引会带来什么好处吗 是否有任何方法或工具可以告诉我(以数字形式)索引的使用频率 编辑:我使用的是2.6.4版 EDIT2:我现在使用的是3.0.3版对,所以我会这样做 首先,您需要一个特定集合的所有索引的列表(这将逐个集合完成)。假设我们正在监视用户集合,以查看哪些索引是无用的 因此,我运行了一个db.user.getIndexes(),这将产生一个可解析的JSON输出(您可以通过客户端的command()运行它,也可以与脚本集成) 现在

我有一个包含很多索引的MongoDB集合

删除很少使用的索引会带来什么好处吗

是否有任何方法或工具可以告诉我(以数字形式)索引的使用频率

编辑:我使用的是2.6.4版


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"
    },