鍍金池/ 教程/ 數(shù)據(jù)庫(kù)/ 覆蓋索引查詢
更新文檔
GridFS
Rockmongo 管理工具
Map Reduce
Java
創(chuàng)建備份
數(shù)據(jù)模型
創(chuàng)建數(shù)據(jù)庫(kù)
映射
查詢文檔
索引限制
ObjectId
刪除文檔
數(shù)據(jù)類型
高級(jí)索引
索引
優(yōu)勢(shì)
記錄排序
查詢分析
插入文檔
刪除集合
全文檢索
創(chuàng)建集合
概述
數(shù)據(jù)庫(kù)引用
覆蓋索引查詢
安裝環(huán)境
PHP
刪除數(shù)據(jù)庫(kù)
固定集合
關(guān)系
聚合
自動(dòng)增長(zhǎng)
復(fù)制
限制記錄
部署
分片
正則表達(dá)式
原子操作

覆蓋索引查詢

何為覆蓋查詢

在每一個(gè) MongoDB 官方文檔中,覆蓋查詢都具有以下兩個(gè)特點(diǎn):

  • 查詢中的所有字段都屬于一個(gè)索引;
  • 查詢所返回的所有字段也都屬于同一索引內(nèi)。

既然查詢中的所有字段都屬于一個(gè)索引,MongoDB 就會(huì)利用同一索引,匹配查詢集合并返回結(jié)果,而不需要實(shí)際地查看文檔。因?yàn)樗饕嬖谟?RAM 中,從索引中獲取數(shù)據(jù)要比通過(guò)掃描文檔獲取數(shù)據(jù)快得多。

使用覆蓋查詢

為了測(cè)試覆蓋查詢,假設(shè)在一個(gè) users 集合中包含下列文檔:

{
   "_id": ObjectId("53402597d852426020000002"),
   "contact": "987654321",
   "dob": "01-01-1991",
   "gender": "M",
   "name": "Tom Benzamin",
   "user_name": "tombenzamin"
}

下面我們將為 users 集合中的 genderuser_name 字段創(chuàng)建一個(gè)符合索引。使用下列查詢:

>db.users.ensureIndex({gender:1,user_name:1})

這一索引將覆蓋下列查詢:

>db.users.find({gender:"M"},{user_name:1,_id:0})

也就是說(shuō),對(duì)于上面的查詢,MongoDB 不會(huì)去查看文檔,轉(zhuǎn)而從索引數(shù)據(jù)中獲取所需的數(shù)據(jù),這顯然要快得多。

既然索引不包含 _id 字段,那么當(dāng)查詢中默認(rèn)返回 _id 時(shí),我們可以在 MongoDB 的查詢結(jié)果集中將其排除掉。下面的查詢就不會(huì)被覆蓋。

>db.users.find({gender:"M"},{user_name:1})

最后,需要記住的是,如果出現(xiàn)下列情況,索引不能覆蓋查詢:

  • 索引字段是數(shù)組
  • 索引字段是子文檔
上一篇:Rockmongo 管理工具下一篇:插入文檔