MongoDb 索引
?索引詳講
1.創建簡單索引
準備數據:
for(var i = 0 ; i<200000 ;i++){
db.books.insert({number:i,name:i+"book"})
}
1.先檢驗一下查詢性能
var start = new Date()
db.books.find({number:65871})
var end = new Date()
end - start
輸出結果,可以看到是94秒,
var start = new Date()
> db.books.find({number:65871})
{ "_id" : ObjectId("5b682d28707a6a48fda446f5"), "number" : 65871, "name" : "65871book" }
> var end = new Date()
> end - start
94
2.為number 創建索引
注意在 3.0.0 版本前創建索引方法為 db.collection.ensureIndex(),之后的版本使用了 db.collection.createIndex() 方法,ensureIndex() 還能用,但只是 createIndex() 的別名。
ensureIndex:創建的是文本索引
createIndex: 為普通索引
1、正序索引, 2、倒序索引,
使用ensureIndex創建的是文本索引
db.books.ensureIndex({number:1})
比如查詢最近一段時間;一個月 、一個季度,建議倒序;
db.books.ensureIndex({number:1});
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
//使用createIndex 創建索引
db.books.createIndex({"name":1,"age":-1})
3.再執行第一部的代碼可以看出有數量級的性能提升 11毫秒
var start = new Date()
>
> db.books.find({number:65871})
{ "_id" : ObjectId("5b682d28707a6a48fda446f5"), "number" : 65871, "name" : "65871book" }
>
> var end = new Date()
>
> end - start
11
createIndex() 接收可選參數,可選參數列表如下:
Parameter | Type | Description |
---|---|---|
background | Boolean | 建索引過程會阻塞其它數據庫操作,background可指定以后臺方式創建索引,即增加 "background" 可選參數。 "background" 默認值為false。 |
unique | Boolean | 建立的索引是否唯一。指定為true創建唯一索引。默認值為false. |
name | string | 索引的名稱。如果未指定,MongoDB的通過連接索引的字段名和排序順序生成一個索引名稱。 |
dropDups | Boolean | 在建立唯一索引時是否刪除重復記錄,指定 true 創建唯一索引。默認值為 false. |
sparse | Boolean | 對文檔中不存在的字段數據不啟用索引;這個參數需要特別注意,如果設置為true的話,在索引字段中不會查詢出不包含對應字段的文檔.。默認值為 false. |
expireAfterSeconds | integer | 指定一個以秒為單位的數值,完成 TTL設定,設定集合的生存時間。 |
v | index version | 索引的版本號。默認的索引版本取決于mongod創建索引時運行的版本。 |
weights | document | 索引權重值,數值在 1 到 99,999 之間,表示該索引相對于其他索引字段的得分權重。 |
default_language | string | 對于文本索引,該參數決定了停用詞及詞干和詞器的規則的列表。 默認為英語 |
language_override | string | 對于文本索引,該參數指定了包含在文檔中的字段名,語言覆蓋默認的language,默認值為 language. |
實例
在后臺創建索引:
db.values.createIndex({open: 1, close: 1}, {background: true})
2.索引使用需要注意的地方
1.創建索引的時候注意1是正序創建索引-1是倒序創建索引
2.索引的創建在提高查詢性能的同事會影響插入的性能
對于經常查詢少插入的文檔可以考慮用索引
3.符合索引要注意索引的先后順序
4.每個鍵全建立索引不一定就能提高性能呢
索引不是萬能的
5.在做排序工作的時候如果是超大數據量也可以考慮加上索引
用來提高排序的性能
3、索引名稱
創建索引同時指定索引的名字db.books.ensureIndex({指定索引,索引的名字)
db.books.ensureIndex({name:-1},{name:”bookname”})
4.唯一索引
4.1如何解決文檔books不能插入重復的數值
建立唯一索引
db.books.ensureIndex({name:-1},{unique:true})
試驗
db.books .insert({name:”1book”})
E11000 duplicate key error collection: foobar.books index: bookname dup key: { : "1
book" }
5.剔除重復值
5.1如果建議唯一索引之前已經有重復數值如何處理。
db.books.ensureIndex({name:-1},{unique:true,dropDups:true})
參數 | 類型 | 描述 |
---|---|---|
background | boolean | 創建索引在后臺運行,不會阻止其他對數據庫操作 |
unique | boolean | 創建唯一索引,文檔的值不會重復 |
name | string | 索引名稱,默認是:字段名_排序類型 開始排序 |
sparse | boolean | 過濾掉null,不存在的字段 |
如果存在重復索引,刪除重復的數據,只保留一條數據;
6.Hint
6.1如何強制查詢使用指定的索引呢?
比如建了四個索引,我指定其中的一個,比如name;
db.books.find({name:"1book",number:1}).hint({name:-1})
指定索引必須是已經創建了的索引
7.Explain
7.1如何詳細查看本次查詢使用那個索引和查詢數據的狀態信息
后續完善
8.查看索引
db.books.getIndexes()
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "foobar.books"
},
{
"v" : 2,
"key" : {
"number" : 1
},
"name" : "number_1",
"ns" : "foobar.books"
},
{
"v" : 2,
"unique" : true, //唯一索引
"key" : {
"name" : -1 //倒序索引
},
"name" : "bookname", //索引名稱
"ns" : "foobar.books" // 數據庫
}
]
9、創建符合索引
db.books.createIndex({"name":1, "number":-1})
插入成功
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 3,
"numIndexesAfter" : 4,
"ok" : 1
}
查看一下db.books.getIndexex();
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "foobar.books"
},
{
"v" : 2,
"key" : {
"number" : 1
},
"name" : "number_1",
"ns" : "foobar.books"
},
{
"v" : 2,
"unique" : true,
"key" : {
"name" : -1
},
"name" : "bookname",
"ns" : "foobar.books"
},
{
"v" : 2,
"key" : {
"name" : 1,
"number" : -1
},
"name" : "name_1_number_-1",
"ns" : "foobar.books"
}
]
10、多鍵索引
11、文本索引
一個集合最多只能創建 一個 文本 索引。
12、2dsphere 索引
13、2d索引 (空間索引)
1.準備數據;
var map = [{
"gis" : {
"x" : 185,
"y" : 150
}
},{
"gis" : {
"x" : 70,
"y" : 180
}
},{
"gis" : {
"x" : 75,
"y" : 180
}
},{
"gis" : {
"x" : 185,
"y" : 185
}
},{
"gis" : {
"x" : 65,
"y" : 185
}
},{
"gis" : {
"x" : 50,
"y" : 50
}
},{
"gis" : {
"x" : 50,
"y" : 50
}
},{
"gis" : {
"x" : 60,
"y" : 55
}
},{
"gis" : {
"x" : 65,
"y" : 80
}
},{
"gis" : {
"x" : 55,
"y" : 80
}
},{
"gis" : {
"x" : 0,
"y" : 0
}
},{
"gis" : {
"x" : 0,
"y" : 200
}
},{
"gis" : {
"x" : 200,
"y" : 0
}
},{
"gis" : {
"x" : 200,
"y" : 200
}
}]
for(var i = 0;i<map.length;i++){
db.map.insert(map[i])
}
1.查詢出距離點(70,180)最近的3個點
添加2D索引
db.map.createIndex(keypattern[,options])
db.map.ensureIndex({"gis":"2d"},{min:-1,max:201})
默認會建立一個[-180,180]之間的2D索引
db.map.createIndex({"索引名字":"2d"}, {索引范圍,min:0,max:200});
db.map.createIndex({"gis":"2d"}, {min:0, max:360});
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
查詢點(70,180)最近的3個點
db.map.find({"gis":{$near:[70,180]}},{gis:1,_id:0}).limit(3)
2.查詢以點(50,50)和點(190,190)為對角線的正方形中的所有的點
db.map.find({"gis":{"$within":{$box:[[50,50],[190,190]]}}},{"_id":0,});
{ "gis" : { "x" : 50, "y" : 50 } }
{ "gis" : { "x" : 50, "y" : 50 } }
{ "gis" : { "x" : 60, "y" : 55 } }
{ "gis" : { "x" : 55, "y" : 80 } }
{ "gis" : { "x" : 65, "y" : 80 } }
{ "gis" : { "x" : 65, "y" : 185 } }
{ "gis" : { "x" : 70, "y" : 180 } }
{ "gis" : { "x" : 75, "y" : 180 } }
{ "gis" : { "x" : 185, "y" : 150 } }
{ "gis" : { "x" : 185, "y" : 185 } }
3.查詢出以圓心為(56,80)半徑為50規則下的圓心面積中的點
db.map.find({"gis":{"$within":{$center:[[56,80],50]}}},{_id:0, gis:1})
14、hashed indexes
15、索引屬性
?索引管理
1.system.indexes
1.1在shell查看數據庫已經建立的索引
db.system.indexes.find()
db.system.namespaces.find()
2.后臺執行
2.1執行創建索引的過程會暫時鎖表問題如何解決?
為了不影響查詢我們可以叫索引的創建過程在后臺
db.books.ensureIndex({name:-1},{background:true})
3.刪除索引
3.1批量和精確刪除索引 runCommand({}) 可以執行任意的mongodb命令
db.books.dropIndex( { "number" : 1 } );
db.runCommand({dropIndexes : ”books” , index:”name_-1”})
db.runCommand({dropIndexes : ”books” , index:”*”})
智能推薦
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_...