1. 程式人生 > 實用技巧 >MongoDB 索引

MongoDB 索引

索引

索引是特殊的資料結構,儲存在一個易於遍歷讀取的資料集合中,索引是對資料庫表中一列或多列的值進行排序的一種結構,MongoDB 的索引儲存在記憶體中,是B樹結構

  • db.collection.createIndex(keys, options),使用createIndex() 方法建立索引

    • Key 值為要建立的索引欄位,1 指定按升序建立索引,-1 指定降序

    # 建立索引:按k1升序
    db.collection.createIndex({"k1":1}})
    # 建立複合索引,按k2升序,k3降序
    db.collection.createIndex({"k2":1,"k3":-1}})
    • options 可選引數:

      • background,布林值,建索引過程會阻塞其它資料庫操作,background可指定以後臺方式建立索引,即增加 "background" 可選引數。 "background" 預設值為false

      • unique,布林值,建立的索引是否唯一。指定為true建立唯一索引。預設值為false.

      • name,字串,索引的名稱。如果未指定,MongoDB的通過連線索引的欄位名和排序順序生成一個索引名稱

      • weights,索引權重值,數值在 1 到 99,999 之間,表示該索引相對於其他索引欄位的得分權重

  • getIndexes(),檢視索引

  • totalIndexSize(),檢視索引大小

  • dropIndexes(<index_name>),刪除索引,可以指定索引名稱刪除

索引查詢

使用索引查詢有兩個條件

  • 所有查詢欄位是索引的一部分

  • 所有查詢返回的欄位在同一個索引中

因為索引存在於RAM中,從索引中獲取資料比通過掃描文件讀取資料要快得多

_id在查詢中會預設返回,如果索引欄位沒有包含 _id 欄位,注意查詢條件要新增 "_id":0 ,使查詢結果不包含 _id欄位

不能使用索引查詢的情況:

  • 正則表示式及非操作符,如 $nin, $not, 等。

  • 算術運算子,如 $mod, 等。

  • $where 子句

查詢分析

MongoDB 查詢分析可以確保我們所建立的索引是否有效,是查詢語句效能分析的重要工具

MongoDB 查詢分析常用函式有:explain() 和 hint()。

  • explain

explain 操作提供了查詢資訊,使用索引及查詢統計等。有利於我們對索引的優化

db.collextion.find({...}).explain(),查詢分析結果:

  1. indexOnly: 欄位為 true ,表示使用了索引

  2. cursor:使用了索引是 BtreeCursor 型別的遊標,沒有使用索引時,遊標的型別是 BasicCursor

  • hint

可以使用 hint 來強制 MongoDB 使用一個指定的索引