最近用mongodb来做一个项目,在看其关于复合索引部分的时候有一个疑惑:
“复合索引同样可用于局部属性的搜索,但必须依照索引字段顺序。比如创建索引字段顺序 "a,b,c",那么仅对 "a,b,c"、"a,b"、"a" 查询有效,而对 "b,c" 之类的组合无效。”
来源:传说中”雨痕“的博客 http://www.rainsts.net/article.asp?id=1033
这不是跟mysql的复合索引一致么?真的是这样么?继续对这个问题的探究。
查阅mongodb的官网,有这样一段描述:
New in 1.6+
Now you can also use the compound index to service any combination of equality and range queries from the constitute fields. If the first key of the index is present in the query, that index may be selected by the query optimizer. If the first key is not present in the query, the index will only be used if hinted explicitly. While indexes can be used in many cases where an arbitrary subset of indexed fields are present in the query, as a general rule the optimal indexes for a given query are those in which queried fields precede any non queried fields.
初读一遍,发现惊喜,1.6+上的新特性? 难道当前的复合索引已经支持任意复合索引的组合子集了么?怀着期待去操作了一把:
首先参看子集的版本是否1.6+:
> db.version()
1.6.5
然后查看我自己的collections的复合索引:
> db.caption.getIndexes()
[
{
"name" : "_id_",
"ns" : "Caption.caption",
"key" : {
"_id" : 1
}
},
{
"name" : "movie_longth",
"ns" : "Caption.caption",
"key" : {
"movieID" : 1,
"longth" : 1
},
"unique" : false,
"_id" : ObjectId("4d2d714b4637c31478000001")
}
]
Ok ,现在尝试只用复合索引中的后一字段longth来查询:
> db.caption.find({longth:{$lt:20}}).explain()
{
"cursor" : "BasicCursor",
"nscanned" : 5,
"nscannedObjects" : 5,
"n" : 2,
"millis" : 0,
"indexBounds" : {
}
}
失望,并没有期望中的使用到索引。
尝试查询longth,以movieID排序:
> db.caption.find({longth:{$lt:20}}).sort({movieID:1}).explain()
{
"cursor" : "BtreeCursor movie_longth",
"nscanned" : 2,
"nscannedObjects" : 2,
"n" : 2,
"millis" : 0,
"indexBounds" : {
"movieID" : [
[
{
"$minElement" : 1
},
{
"$maxElement" : 1
}
]
],
"longth" : [
[
-1.7976931348623157e+308,
20
]
]
}
}
就是说放过来仍然是能够用到索引的。
nice,验证想法应该可以对任意子集生效的。再次细读官网的说明,发现重点:
” If the first key of the index is present in the query, that index may be selected by the query optimizer. If the first key is not present in the query, the index will only be used if hinted explicitly. “
意思是说如果第一键出现默认是能被优化器用到index的,如果第一键未出现,但还是可以显示指定使用组合索引的,遂继续尝试:
> db.caption.find({longth:{$lt:20}}).hint({movieID:1,longth:1}).explain()
{
"cursor" : "BtreeCursor movie_longth",
"nscanned" : 2,
"nscannedObjects" : 2,
"n" : 2,
"millis" : 0,
"indexBounds" : {
"movieID" : [
[
{
"$minElement" : 1
},
{
"$maxElement" : 1
}
]
],
"longth" : [
[
-1.7976931348623157e+308,
20
]
]
}
}
这样总算可以让复合索引被任意子集所使用上了。
通过这个小细节的测试和探究,得出一个结论:当我们在网络上查阅资料时,请注意出处以及时间,特别是开源的内容,开源力量不断壮大,更新也是非常迅速,可能的老规则已经有新的替代;非常感谢雨痕的分享让大家熟悉了解到mongodb的使用,但从其文章的时间来看是2010-07,那个时候mongodb的版本还在1.4.5-, 而当前已经在12/9/2010发布了1.6.5。
也给自己在平时做项目使用开源内容的时候多了一份提示:多跟进官网的资料,update新特性。
http://johnnychenjun.blog.163.com/blog/static/1374934062011012103129303/
相关推荐
MONGO的索引跟MYSQL、ORACLE基本上差不多,实现了其中的一部分,当然了,肯定是没有它们功能齐全的,因为MONGO本质上也是基于磁盘文件的,所以如果索引的话,效率是不敢想像的!
MongoDB数据库索引介绍.pptx
当你抱怨MongoDB集合查询效率低的时候,可能你就需要考虑使用索引了,为了方便后续介绍,先科普下MongoDB里的索引机制(同样适用于其他的数据库比如mysql)。 mongo-9552:PRIMARY> db.person.find() { "_id" : ...
MongoDB命名索引和唯一索引.pdf 学习资料 复习资料 教学资源
MongoDB高级索引.pdf 学习资料 复习资料 教学资源
MongoDB简单索引.pdf 学习资料 复习资料 教学资源
MongoDB覆盖索引查询.pdf 学习资料 复习资料 教学资源
mongodb中如何建立高效索引,文档讲述的很清楚
MongoDB 覆盖索引查询 官方的MongoDB的文档中说明,覆盖查询是以下的查询: 所有的查询字段是索引的一部分 所有的查询返回字段在同一个索引中 由于所有出现在查询中的字段是索引的一部分, MongoDB 无需在整个数据...
MongoDB-索引
计算机后端-PHP视频教程. mongodb07 索引.wmv
MongoDB支持的索引种类很多,诸如单键索引,复合索引,多键索引,TTL索引,文本索引,空间地理索引等。同时索引的属性可以具有唯一性,即唯一索引。唯一索引用于确保索引字段不存储重复的值,即强制索引字段的唯一性...
MongoDB 学习PPT
MongoDB是一个领先的NoSQL数据库,以其灵活的文档型数据模型、简单的安装和高效的操作而闻名。MongoDB的记录是由字段和值对组成的文档,类似于JSON对象,支持不同字段的文档在同一个集合中,以及线上修改数据模式...
主要介绍了 MongoDB TTL索引的实例详解的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下
同时,深入探讨MongoDB索引的类型(如单键索引、复合索引、多键索引等),并分析索引的创建、管理和优化策略。此外,文章还介绍了索引对查询性能的影响,包括如何通过explain()方法分析查询和索引效率,以及覆盖查询...
11、MongoDB聚合操作及索引使用详解_ev.rar11、MongoDB聚合操作及索引使用详解_ev.rar11、MongoDB聚合操作及索引使用详解_ev.rar11、MongoDB聚合操作及索引使用详解_ev.rar11、MongoDB聚合操作及索引使用详解_ev.rar...
主要介绍了MongoDB性能篇之创建索引,组合索引,唯一索引,删除索引和explain执行计划的相关资料,需要的朋友可以参考下
MongoDB索引优化与管理-刘诚杰 天痕,介绍 1. 索引概念 2. 索引优化 3. 执行计划 4. 索引管理