这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。

索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构

语法:

ensureIndex()方法基本语法格式如下所示:

语法中 Key 值为你要创建的索引字段,1为指定按升序创建索引,-1即为降序。

explain命令

MongoDB 提供了一个 explain 命令让我们获知系统如何处理查询请求。利用 explain 命令,可以很好地观察系统如何使用索引来加快检索,同时可以针对性优化索引。

实例

1. 构建数据

  1. { "_id" : 1, "item" : "f1", type: "food", quantity: 500 },
  2. { "_id" : 2, "item" : "f2", type: "food", quantity: 100 },
  3. { "_id" : 4, "item" : "p2", type: "paper", quantity: 150 },
  4. { "_id" : 5, "item" : "f3", type: "food", quantity: 300 },
  5. { "_id" : 6, "item" : "t1", type: "toys", quantity: 500 },
  6. { "_id" : 8, "item" : "a2", type: "apparel", quantity: 400 },
  7. { "_id" : 9, "item" : "t2", type: "toys", quantity: 50 },
  8. { "_id" : 10, "item" : "f4", type: "food", quantity: 75 }])

2. 无索引查询

  1. db.inventory.find(
  2. {
  3. quantity: {
  4. $lte: 200
  5. }
  6. ).explain("executionStats")

  • COLLSCAN
  • nReturned

就是所谓的numReturned,就是说最后返回的num个数,从图中可以看到,就是最终返回了三条。。。

  • docsExamined

就是documentsExamined,检查了10个documents。。。而从返回上面的nReturned。。。

从上面三个信息中得出,docsExamined 10条数据,最终才返回3条,说明做了7条数据scan的无用功,那么这个时候问题就来了!!!

3. 创建索引

知道前因后果之后,我们就可以进行针对性的建立索引,比如在quality字段之上,如下:

索引 - 图1

好了,这时候就有意思了,当我们执行完createindex之后,再次explain,4个重要的parameters就漂下来了:

  • IXSCAN
  • nReturned, totalDocsExamined, totalKeysExamined

从图中可以看到三个参数都是3,这就说明我们的mongodb查看了3个key,3个document,返回3个文档,这个就是所谓的高性能所在,对吧。

3. 查看索引

getindexes可以查看索引,

  1. db.inventory.getIndexes()
  • 代价

    索引会增加写操作的代价

  • 收益

    查询效率高