MongoDB索引
準備階段
插入10W條數據測試準備:
MongoDB性能分析函數(explain)
cursor #查詢方式 BasicCursor:順序查找即“表掃描”
n #最終返回文檔數量
nscanned #數據庫瀏覽了10w個文檔
millis #總共耗時50毫秒
查看索引
db.age.getIndexes()
命名索引
db.age.ensureIndex({"name":1},{name:"normal_index"})
刪除索引
db.age.dropIndex("name_1")
創建索引
單鍵索引
db.age.ensureIndex({"name":1})
創建索引性能對比:
唯一索引
重復的鍵值自然就不能插入
db.age.ensureIndex({"name":1},{unique:true})
稀疏索引
沒有此字段的數據不建立索引,節約磁盤
db.age.ensureIndex({"name":1},{sparse:true/false})
組合索引
db.age.ensureIndex({"name":1,"age":1})
db.age.ensureIndex({"age":1,"name":1})
過期索引
在一段時間后會過期的索引
在索引過期后,相應的數據會被刪除
適合存儲在一段時間之后會失效的數據,比如用戶的登錄信息、存儲的日志等。
db.age.ensureIndex({time:1},{expireAfterSeconds:30}) #索引30秒后失效
db.age.insert({time:new Date()}) #time必須為ISODate或者ISODate數組,不能為時間戳
全文索引
創建
db.age.ensureIndex({key:"text"}) #key:字段名,value:固定字符串text
db.age.ensureIndex({key1:"text",key2:"text"}) #在多個字段上創建全文索引
db.age.ensureIndex({"$**":"text"}) #給所有字段建立全文索引
查詢
db.age.find({$text:{$search:"coffee"}})
db.age.find({$text:{$search:"aa bb cc"}}) #空格代表或操作,aa或bb或cc
db.age.find({$text:{$search:"aa bb -cc"}}) #-號為非操作,即不包含cc的
db.age.find({$text:{$search: "\"aa\" \"bb\" \"cc\""}}) #""號為與操作,aa與bb與cc
查詢返回相似度
db.age.find({$text:{$search:"aa bb"}},{score:{$meta:"textScore"}})
db.age.find({$text:{$search:"aa bb"}},{score:{$meta:"textScore"}}).sort({score:{$meta:"textScore"}}) #返回相似度并排序
全局索引的限制:
- 每次查詢,只能指定一個$text查詢
- 不能出現在$nor查詢中
- 查詢中如果包含了$text, hint(強制指定索引)不再起作用
- MongoDB全文索引還不支持中文
地理位置索引
2D地理位置索引的取值范圍以及表示方法 經緯度[經度,緯度]
經緯度取值范圍:經度[-180,180] 緯度[-90,90]
1. 2D索引
創建
db.collection.ensureIndex({w:"2d"})
插入
db.collection.insert({w:[180,90]})
查詢
(1) $near 查詢距離某個點最近的點 ,默認返回最近的100個點
db.collection.find({w:{$near:[x,y]}})
(2) $geoWithin查詢某個形狀內的點
#查詢矩形中的點
db.collection.find({w:{$geoWithin:{$box:[[0,0],[3,3]]}}})
#查詢圓中的點
db.collection.find({w:{$geoWithin:{$center:[[0,0],5]}}})
#查詢多邊形中的點
db.collection.find({w:{$geoWithin:{$polygon:[[0,0],[0,1],[2,5],[6,1]]}}})
(3)geoNear查詢
#2d索引不支持minDistance
#num:返回數量
db.runCommand({geoNear:"collection名稱",near:[x, y],minDistance:10,maxDistance:10,num:1...})
2. 2Dsphere索引
創建
db.collection.ensureIndex({w:"2dsphere"})
插入
#位置格式
{type:"Point/LineString/Polygon",coordinates:[x,y]}
db.sphere.insert({name:"A",sp:{type:"Point",coordinates:[105.754484701156,41.689607057699]}})
db.sphere.insert({name:"B",sp:{type:"Point",coordinates:[105.304045248031,41.783456183240]}})
db.sphere.insert({name:"C",sp:{type:"Point",coordinates:[105.084318685531,41.389027478812]}})
db.sphere.insert({name:"D",sp:{type:"Point",coordinates:[105.831388998031,41.285916385493]}})
db.sphere.insert({name:"E",sp:{type:"Point",coordinates:[106.128706502914,42.086868474465]}})
db.sphere.insert({name:"F",sp:{type:"Point",coordinates:[105.431074666976,42.009365053841]}})
db.sphere.insert({name:"G",sp:{type:"Point",coordinates:[104.705977010726,41.921549795110]}})
查詢
#2dsphere索引支持minDistance
#num:返回數量
db.runCommand({
geoNear:"collection名稱",
near:{type:"Point/LineString/Polygon",coordinates:[x,y]},
minDistance:10,
maxDistance:10,
num:1,
...})
>>>2Dsphere索引實踐>>>
智能推薦
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_...