mongodb學習(六)索引

來源:互聯網
上載者:User

標籤:style   blog   http   color   使用   資料   for   2014   

準備工作: 先插入100萬條資料

for(i=0;i<=1000000;i++){    db.users.insert({           "i":i,           "username":"user"+i,           "age":Math.floor(Math.random()*120),           "created":new Date()    })}        

 1. 建立索引: 資料量越大建立索引時間越長

db.users.ensureIndex({"username":1})
db.users.find({"username":"user234455"}).explain()
 查詢速度飛快...O(∩_∩)O~使用索引的代價:  添加一個索引,每次插入,更新,刪除操作都會耗費更多時間;原因是資料變動時mongodb每次都要更新文檔和索引. 在一個集合上通常不應該擁有兩個以上的索引.在常用的鍵上建立索引.2. 複合索引:就是建立在多個鍵上的索引    (索引在排序時非常快,前提是首先使用索引鍵排序)
db.users.ensureIndex({"username":1,"age":1})//每個索引都包含 age 和 name欄位

   三種使用方式:  (mongodb可以在任意方向上對索引進行遍曆)

(1) 點查詢,這種最高效

db.users.find({"age":21}).sort({"username":-1})

(2) 多點查詢: 使用索引查詢出來的結果是無序的,mongodb需要在記憶體中重新排序,然後返回.問題:結果集文檔數量比較大,查詢速度會慢;結果集超過32M,mongodb會出錯

db.users.find({"age":{"$gte":20,"$lte":30}}).sort({"username":1})

(3) 使用另一個索引 {"username":1,"age":1} 可以使用hint強制使用某個索引

db.users.find({"age":{"$gte":20,"$lte":30}}).sort({"name":1}).explain()
db.users.find({"age":{"$gte":20,"$lte":30}}).sort({"name":1}).hint({"name":1,"age":1}).explain()

索引本質上是: 樹,最小的值在最左邊,最大的值在最右邊.

(4) 只有在基於多鍵排序的時候,方向才變得重要.

(5) 覆蓋索引: 索引中已經包含了要尋找的欄位;

(6) 複合索引: 對不同的查詢表現為不同的索引:, {"age":1,"username":1},可以"免費" 擷取以age這個鍵開頭的所有索引;

(7) $where和檢查一個鍵是否存在 無法使用索引; 在索引中不存在的欄位和null欄位的儲存方式是一樣的.

(8)查詢: 將精確匹配的欄位放在前面,將範圍匹配的欄位放在最後;

(9)$or: 可以對每個子句都使用索引,因為實際上$or執行兩次查詢然後將結果集合并,效率不高,儘可能使用 $in

            $or需要每次檢查查詢的結果集並且將重複的文檔移除.

(10)索引嵌套文檔:

db.users.ensureIndex({"loc.city":1})

(11)對數組簡曆索引: 對數組建立索引實際上就是對數組中每一個元素建立索引條目,而不是對數組本身建立索引,一個索引中的數組欄位最多隻有一個.
(12) 索引基數: 就是集合中每個欄位擁有不同值得數量.應該再基數比較高的欄位上建立索引.

(13)explain()  可以提供大量與查詢有關的資訊;如果scanAndOrder為true,那麼說明沒有使用索引,mongodb需要再記憶體中排序,這回很慢

      hint() 強行使用某個索引

db.users.find({"age":28}).hint({"age":1})

3. 何時不應該使用索引: 結果集在原集合中所佔比重越大,索引速度就越慢. 一般來說: 查詢需要返回結果集30%的就需要比較 全表掃描和索引尋找的速度...
    索引尋找: 索引需要進行兩次尋找,一次是尋找索引條目,一次是根據索引條目尋找相應文檔; 使用{"$natural":1} 強制全表掃描

db.users.find({"age":28}).hint({"$natural":1})

4. 索引類型:
   (1) 唯一索引: (會把null看做值)

db.users.ensureIndex({"usename":1},{"unique":true})

  複合唯一索引: 所有鍵的組合值必須是唯一的.

  去除重複的索引:

db.users.ensureIndex({"usename":1},{"unique":true,"dropDups":true})

(2) 稀疏索引: (如果一個肯能存在也可能不存在的欄位,當它存在時,它必須是唯一的),稀疏索引可以使唯一的.

db.users.ensureIndex({"email":1},{"sparse":true})

5. 索引管理: 資料庫所有的索引都儲存在system.indexes集合中; 索引順序很重要: {"age":1,"username":1},{"username":1,"age":1}是不同的索引

db.users.getIndexes() //uses所有的索引都可以在這裡查看

(1)索引標識:索引名稱是唯一的. 可以自訂索引

db.users.ensureIndex({"usename":1},{"name":"myIndex"})

(2)刪除索引: mongodb建立索引時會阻塞所有對資料的讀寫請求.一直到建立完畢

db.users.drop("username_1")

6. 固定集合...

 

 

 

 

 

 

 

     

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.