准備工作: 先插入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()

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. 固定集合...