此章节,是作者阅读网上资料,通过结合自身项目的实践。
引用:原文链接:http://iamcaihuafeng.blog.sohu.com/151638529.html
(本文是一篇转载文章,作者在对MongoDB文档进行了细致的阅读后,总结出了MongoDB的各种索引的用法。)
索引能提高检索数据的速度,你可以想像成在MySQL中创建索引一样,同样索引也是用B-Tree也实现的。
创建schedule的collection:
DB db = m.getDB("ms_basic");
DBCollection coll = db.getCollection("schedule");
//插入数据略过
List<DBObject> indexList = coll.getIndexInfo();
for (DBObject o : indexList) {
System.out.println("index ---------" + o);
}
运行结果:
index ---------
{ "name" : "_id_" , "ns" : "ms_basic.schedule" , "key" : { "_id" : 1}}
此时可以看到,索引为_id,内置的,按照升序排列
System.out.println("SELECT * FROM schedule WHERE rsc='ATM033101'");
startTime = System.currentTimeMillis();
query = new BasicDBObject();
query.put("rsc","ATM033101");
cur = coll.find(query);
System.out.println("查询获得的长度"+cur.count());
System.out.println("查询耗
时:"+(System.currentTimeMillis()-startTime)+"毫秒.");
运行结果:
-----------华丽分隔线无rsc索引查询---------------
SELECT * FROM schedule WHERE rsc='ATM033101'
查询获得的长度1
查询耗时:63毫秒.
explain分析:{ "cursor" : "BasicCursor" , "indexBounds" : [ ] , "nscanned" : 4597 , "nscannedObjects" : 4597 , "n" : 1 , "millis" : 0 , "oldPlan" : { "cursor" : "BasicCursor" , "indexBounds" : [ ]} , "allPlans" : [ { "cursor" : "BasicCursor" , "indexBounds" : [ ]}]}
看看官方的解释:
public DBObject explain()
Returns an object containing basic information about the exectution of the query that created this cursor This creates a DBObject with the key/value pairs: "cursor" : cursor type "nScanned" : number of records examined by the database for this query "n" : the number of records that the database returned "millis" : how long it took the database to execute the query
1、单列索引
在字段rsc上创建索引,1 (ascending) or -1 (descending)
MongoDb提供两种接口给我们创建索引:
ensureIndex和createIndex
具体可以查查在线的API:http://api.mongodb.org/java/2.0/index.html
coll.createIndex(new BasicDBObject("rsc", 1));
运行:
List<DBObject> indexList = coll.getIndexInfo();
for (DBObject o : indexList) {
System.out.println("index ---------" + o);
}
结果为:
index ---------
{ "name" : "_id_" , "ns" : "ms_basic.schedule" , "key" : { "_id" : 1}}
index ---------
{ "name" : "rsc_1" , "ns" : "ms_basic.schedule" , "key" : { "rsc" : 1}}
再次查找:query.put("rsc","ATM033101");
-----------华丽分隔线有rsc索引查询---------------
SELECT * FROM schedule WHERE rsc='ATM033101'
查询获得的长度1
查询耗时:47毫秒.
explain分析:{ "cursor" : "BtreeCursor rsc_1" , "indexBounds" : [ [ { "rsc" : "ATM033101"} , { "rsc" : "ATM033101"}]] , "nscanned" : 1 , "nscannedObjects" : 1 , "n" : 1 , "millis" : 0 , "oldPlan" : { "cursor" : "BtreeCursor rsc_1" , "indexBounds" : [ [ { "rsc" : "ATM033101"} , { "rsc" : "ATM033101"}]]} , "allPlans" : [ { "cursor" : "BtreeCursor rsc_1" , "indexBounds" : [ [ { "rsc" : "ATM033101"} , { "rsc" : "ATM033101"}]]}]}
此时花费了:47毫秒
从explain分析中,可以看到:"cursor" : "BtreeCursor rsc_1" , "indexBounds" : [ [ { "rsc" : "ATM033101"},说明使用了索引来进行查询。
2、默认索引
刚刚看到,一共显示有2个索引,包括自己创建的,其中_id是创建表的时候自动创建的索引,此索引是不能够删除的。
An index is always created on _id. This index is special and cannot be deleted. The _id index enforces uniqueness for its keys.
本文转自jooben 51CTO博客,原文链接:http://blog.51cto.com/jooben/365893