
MongoDB 版本:3.4
1 )这个情况下,怎么才能建立我想要的复合索引呢?
存在索引:
db.tests.createIndex({'b':'text'}) db.tests.createIndex({'n':1}) db.tests.createIndex({'a':1}) 现在我想创建一个复合索引:
db.tests.createIndex({'n':1,'a':1,'b':'text'}) #Error info: { "ok" : 0, "errmsg" : "only one text index per collection allowed, found existing text index \"b_text\"", "code" : 67, "codeName" : "CannotCreateIndex" } 2 )在这个版本下,是不是不需要严格去规定复合查询时的条件的位置? 存在以下的复合索引
db.tests.createIndex({'n':1,'a':1}) 以下的两种情况都使用到了索引:
#1 db.tests.find({'n':'shandong','a':'88'}) #2 db.tests.find({'a':'88', 'n':'shandong'}) 两个问题,不是太明白,还望指点。谢谢
1 TJT 2017-05-16 00:15:38 +08:00 顺序无关,mongo 会自己决定如何使用索引。 另外如果你两个字段都有索引,有些情况下会有限使用单独的索引而不是联合索引,explain 一下就知道,前几天刚踩过坑。 |
2 linkbg OP @TJT 谢谢,那第一个那种,如果我把 b_text 索引删掉,创建复合索引的话,会不会影响只搜索 b 这个字段的效率呢? |
3 TJT 2017-05-16 00:45:10 +08:00 @linkbg 这就不知道了,你可以实验一下:db.tests.find(QUERY).explain(),看一下 winningPlan 是什么。我觉得复合索引不会对单字段的搜索有帮助。 |
4 TJT 2017-05-16 00:52:48 +08:00 至于第一个问题,a 和 n 如果能把结果集限制的足够小,仅针对 a 和 n 创建符合索引就好,速度上不会比三个字段的符合索引慢太多。 |
5 linkbg OP @TJT 在删除 b_text 之后,我创建以一个 ``` db.tests.createIndex({'n':1,'a':1,'b':'text'}) ``` 可是在执行查询的时候,整个 mongo 就退出了。使用不了。日志: ``` [conn1] Invariant failure amExpr->numChildren() >= prefixEnd src/mongo/db/query/planner_access.cpp 466 [conn1] ***aborting after invariant() failure [conn1] Got signal: 6 (Aborted). ``` 权限也是正常的。其他 find 正常,只要用到这个索引就 over。 |