這些天項目改版,時間比較緊,博客也就沒跟得上,還望你們見諒。算法
好,今天分享下mongodb中關於索引的基本操做,咱們平常作開發都避免不了要對程序進行性能優化,而程序的操做無非就是CURD,一般咱們sql
又會花費50%的時間在R上面,由於Read操做對用戶來講是很是敏感的,處理很差就會被人唾棄,呵呵。mongodb
從算法上來講有5種經典的查找,具體的能夠參見個人算法速成系列,這其中就包括咱們今天所說的「索引查找」,若是你們對sqlserver比較瞭解數據庫
的話,相信索引查找能給咱們帶來什麼樣的性能提高吧。性能優化
咱們首先插入10w數據,上圖說話:函數
一:性能分析函數(explain)工具
好了,數據已經插入成功,既然咱們要作分析,確定要有分析的工具,幸虧mongodb中給咱們提供了一個關鍵字叫作「explain",那麼怎麼用呢?sqlserver
仍是看圖,注意,這裏的name字段沒有創建任何索引,這裏我就查詢一個「name10000」的姓名。性能
仔細看紅色區域,有幾個咱們關心的key。優化
cursor: 這裏出現的是」BasicCursor",什麼意思呢,就是說這裏的查找採用的是「表掃描」,也就是順序查找,很悲催啊。
nscanned: 這裏是10w,也就是說數據庫瀏覽了10w個文檔,很恐怖吧,這樣玩的話讓人受不了啊。
n: 這裏是1,也就是最終返回了1個文檔。
millis: 這個就是咱們最最最....關心的東西,總共耗時114毫秒。
二:創建索引(ensureIndex)
在10w條這麼簡單的集合中查找一個文檔要114毫秒有一點點讓人不能接收,好,那麼咱們該如何優化呢?mongodb中給
咱們帶來了索引查找,看看能不能讓咱們的查詢一飛沖天.....
這裏咱們使用了ensureIndex在name上創建了索引。」1「:表示按照name進行升序,」-1「:表示按照name進行降序。
個人神啊,再來看看這些敏感信息。
cursor: 這裏出現的是」BtreeCursor",這麼牛X,mongodb採用B樹的結構來存放索引,索引名爲後面的「name_1"。
nscanned: 我擦,數據庫只瀏覽了一個文檔就OK了。
n: 直接定位返回。
millis: 看看這個時間真的不敢相信,秒秒殺。
經過這個例子相信你們對索引也有了感官方面的認識了吧。
三:惟一索引
和sqlserver同樣均可以創建惟一索引,重複的鍵值天然就不能插入,在mongodb中的使用方法是:
db.person.ensureIndex({"name":1},{"unique":true})。
四:組合索引
有時候咱們的查詢不是單條件的,多是多條件,好比查找出生在‘1989-3-2’名字叫‘jack’的同窗,那麼咱們能夠創建「姓名」和"生日「
的聯合索引來加速查詢。
看到上圖,你們或者也知道name跟birthday的不一樣,創建的索引也不一樣,升序和降序的順序不一樣都會產生不一樣的索引,
那麼咱們能夠用getindexes來查看下person集合中到底生成了那些索引。
此時咱們確定很好奇,到底查詢優化器會使用哪一個查詢做爲操做,呵呵,仍是看看效果圖:
看完上圖咱們要相信查詢優化器,它給咱們作出的選擇每每是最優的,由於咱們作查詢時,查詢優化器會使用咱們創建的這些索引來建立查詢方案,
若是某一個先執行完則其餘查詢方案被close掉,這種方案會被mongodb保存起來,固然若是非要用本身指定的查詢方案,這也是
能夠的,在mongodb中給咱們提供了hint方法讓咱們能夠暴力執行。
五: 刪除索引
可能隨着業務需求的變化,原先創建的索引可能沒有存在的必要了,可能有的人想說不必就不必唄,可是請記住,索引會下降CUD這三
種操做的性能,由於這玩意須要實時維護,因此啥問題都要綜合考慮一下,這裏就把剛纔創建的索引清空掉來演示一下:dropIndexes的使用。