MongoDB索引
標簽: mongodb
一、簡介
在MongoDB建立索引能提高查詢效率,如果沒有建立索引,在查詢時,MongoDB必須執行全表掃描,在數據量大時,效率差別就很明顯,對于包括一個沒有索引的排序操作的查詢,服務器必須在返回任何結果之前將所有的文檔加載到內存中來進行排序。
- 索引是特殊的數據結構,
- 索引存儲在一個易于遍歷讀取的數據集合中,
- 索引是對數據庫表中一列或多列的值進行排序的一種結構。
- 索引項的排序支持高效的相等匹配和基于范圍的查詢操作。
注意:從mongoDB 3.0開始ensureIndex被廢棄,使用 createIndex創建索引。
創建索引的語法:
db.collection.createIndex(keys,options)
參數 | 類型 | 描述 |
---|---|---|
keys | document | 一個包含該字段的字段和值對的文檔,該文檔的索引鍵和該值描述該字段的索引類型。對于某個領域的上升索引,指定一個值為1;對于下降的索引,指定一個值為1。MongoDB支持幾種不同的索引類型,包括文本,空間,和哈希索引。查看更多信息的索引類型。右 |
options | document | 在創建索引的時的限制條件 |
二、 索引的基本操作
我們先插入10w條記錄
let arr = [];
for(let i=1; i<=1000000; i++){//15s
arr.push({
"number" : i,
"date" : "2015-07-02",
"cname" : "zcy"+i,
"items" :[ {
"ino" : i,
"quantity" : i,
"price" : 4.0
},{
"ino" : i+1,
"quantity" : i+1,
"price" : 6.0
}
]
})
}
db.orders.insert(arr)
1. 默認索引
存儲在MongoDB集合中的每個文檔(document)都有一個默認的主鍵“_id“,如果我們在添加新的文檔時,沒有指定“_id“值時,MongoDB會創建一個ObjectId值,并會自動創建一個索引在“_id“鍵上,默認索引的名稱是”id“,并無法刪除,如下面的命令查看:
db.orders.getIndexes()
返回一個數組,該數組保存標識和描述集合上現有索引的文檔列表,可以查看我們是否有對某個集合創建索引,并創建哪些索引,方便我們管理。
2. 創建單列索引
我們對文檔單個字段創建索引或者對內嵌文檔的單個字段創建索引
語法:
db.collection.createIndex({field:boolean} })
boolean:對于某個領域的上升索引,指定一個值為1;對于下降的索引,指定一個值為-1。
(1)創建
db.orders.createIndex({cname:1})
我們對orders集合創建了cname索引,默認的索引名稱是”cname_1“
(2)根據條件查詢文檔,并查看查詢效率怎么樣
db.orders.find({“cname”:“zcy100000”}).explain()
explain():查看查詢信息,包含是否走索引
1):沒建索引時,查詢條件cname為zcy100000的文檔
2)有建索引,查詢條件cname為zcy100000的文檔
我們結果是相差很大的,有建索引字段,查詢效率比較高,在大數據時,差別更明顯。
(3). 創建組合索引
我們可以同時對多個鍵創建組合索引
db.orders.createIndex({cname:1,number:-1})
(1)我們對cname和number作為查詢條件時
db.orders.find({“cname”:{$gt:“zcy1000”},“number”:2000}).explain()
2)我們只用兩個索引其中一個作為查詢時
第一種情況:我們條件只使用"cname":{$gt:“zcy1000”}作為查詢條件
db.orders.find({"cname":{$gt:"zcy1000"}}).explain()
第二種情況:我們條件只使用"number":2000作為查詢條件
總結:我們在使用組合索引時,查詢時會用到組合索引的前端的幾種組合。
我們對a、b進組合創建索引,支持查詢時會用到索引的幾種:
- a
- a,b
4. 內嵌文檔的索引
我們對內嵌文檔創建索引時,跟基本文檔創建索引一樣
db.collection.createIndex({field:boolean} })
(1):單列的內嵌文檔的索引創建
db.orders.createIndex({"items.info":1})
我們以items.info字段作為查詢條件,并使用索引的情況
db.orders.find({"items.info":{$lt:100}}).explain()
(2):組合的內嵌文檔的索引的創建
我們對內嵌文檔創建組合索引時,跟基本文檔創建組合索引一樣
db.orders.createIndex({"items.info":1, "items. quantity":-1})
5. 刪除索引
我們對已經創建的索引進行刪除,可以針對具體的集合中索引進行刪除,也可以對所有的集合中的所有索引刪除
(1)具體索引名稱刪除索引
刪除具體的索引,根據索引名稱刪除,如果不知道索引的名稱,可以通過db.collection.getIndexes()查看索引名稱
db.orders.dropIndex(“cname_1”)
(2)刪除集合中所有索引謹慎使用
db.orders.dropIndexes()
總結:
在MongoDB建立索引能提高查詢效率,但在MongoDB新增、修改效率上比較慢
智能推薦
MongoDB備份、索引、復制
1. 數據備份與恢復 2. 索引 索引通常能夠極大的提高查詢的效率,如果沒有索引MongoDB在讀取數據時必須掃描集合中的每個文件并選取那些符合查詢條件的記錄 這種掃描全集合的查詢效率是非常的,特別在處理大量的數據時,查詢可以要花費幾十秒甚至幾分鐘,這對網站的性能是非常致命的 ensureIndex() 接收可選參數,可選參數列表如下: 3. MongoDB復制 3.1 主從復制 3.2 副本集 ...
mongodb--索引(筆記)
介紹 Index 合適的索引可以大大提高數據庫搜索能力 對文檔的部分內容進行排序的數據結構 加快文檔查詢和文檔排序的速度 類型:單鍵索引、復合鍵索引、多鍵索引 特性:唯一性、稀疏性、生存時間 創建索引 db.collections.createIndex() 數組中的每一個元素都會在多鍵索引中創建一個鍵 創建唯一性索引 稀疏性:復合鍵索引也可以具有稀疏性。如果文檔中沒有完全...
MongoDB復合索引詳解
摘要: 對于MongoDB的多鍵查詢,創建復合索引可以有效提高性能。 ### 什么是復合索引? 復合索引,即**Compound Index**,指的是將多個鍵組合到一起創建索引,這樣可以加速匹配多個鍵的查詢。不妨通過一個簡單的示例理解復合索引。 students集合如下: 在name和age兩個鍵分別創建了索引(_id自帶索引): 當進行多鍵查詢時,可以通過[explian()](https:/...
mongoDB-特殊索引
全文檢索 什么是? 使用正則表達式模糊檢索文本內容,對于大段文本來說,效率很低,而且無法理解語義 這個時候可以使用全文檢索,可以快速進行文本檢索,且內置多種語言分詞機制,可理解語義, MongoDB提供文本索引來支持全文檢索,文本索引可以建立在任何字符串格式的鍵上,甚至可 以建立在以字符為元素的數組上 問題: &nbs...
猜你喜歡
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...
Linux C系統編程-線程互斥鎖(四)
互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...