mongo 索引
MongoDB索引Index
索引支持查詢的有效地提高效率。沒有索引,MongoDB必須掃描集合的每個文檔,以選擇與查詢語句匹配的文檔。這種掃描效率很低,需要 MongoDB 處理大量的數據。
索引是特殊的數據結構,以易于遍歷的形式存儲數據集的一小部分。 索引存儲特定字段或一組字段的值,按照索引中指定的字段值排序。
索引構建如何影響數據庫性能?
針對已填充集合的MongoDB索引構建,需要針對該集合進行排他性讀寫鎖定。在mongod釋放鎖定之前需要對集合進行讀取或寫入鎖定的操作必須等待。
*在版本4.2中進行了更改。
- 對于功能兼容版本(fcv) "4.2",MongoDB使用優化的構建過程,該過程僅在索引構建的開始和結束時都保留排他鎖。其余的構建過程將產生交叉的讀寫操作。
- 對于功能兼容版本(fcv) "4.0",默認的前臺索引構建過程將保留整個索引構建的互斥鎖。background索引在構建過程中不會獲得排他鎖。
基于副本集的索引具有特定的性能考慮因素和風險。有關更多信息,請參見復制環境中的索引構建。為了最大程度地減少對副本集(包括分片副本集)建立索引的影響,請使用在副本集上建立索引中所述的滾動索引生成過程。
要返回當前正在運行的索引創建操作的相關信息,請參閱Active Indexing Operations。要在主數據庫或獨立數據庫上終止正在運行的索引創建操作mongod,請使用 db.killOp()。部分構建的索引將被刪除。
不能在副本集的輔助成員上終止復制索引構建。您必須首先在主數據庫上刪除索引。二級服務器將復制刪除操作,并在索引構建完成后刪除索引。索引建立和刪除之后的所有其他復制將會終止。
在創建索引時,可指定如下選項:
1) backgroud,值為true或者false
在后臺創建索引,以便構建索引時不會阻止其他數據庫操作,默認為false。
2) unique 值為true或者false
創建唯一索引,默認值為false。
3) name
指定索引的名稱。如果未指定,mongoDB通過連接索引字段的名稱和排序順序來生成索引名稱。
4) dropDups 值為true或者false
創建唯一索引時,如果出現重復刪除后續出現的相同索引,只保留第一個,默認值為false。
5) sparse 值為true或者false
對文檔中不存在的字段數據不啟用索引,默認值為false。
創建索引
要在集合上創建索引,請使用 db.collection.createIndex()方法。創建索引是一種管理性操作
查看索引
> db.inventory.getIndexes() [ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "game.inventory" },
查看查詢是否使用索引
要檢查MongoDB如何處理查詢,使用 explain()方法。
如何確定要索引的字段?
許多因素決定要索引的字段,包括選擇性,對多種查詢的支持 以及索引的大小。
查看索引的大小
db.collection.stats()包括一個為集合中的每個索引提供了大小信息的indexSizes文檔。
根據其大小,一個索引可能無法放入內存。當服務器具有足夠的RAM用于索引和其余工作集時,索引將加載進內存。當索引太大而無法放入RAM時,MongoDB必須從磁盤讀取索引,這比從RAM讀取要慢得多。
在某些情況下,索引不必完全適合RAM。
寫操作如何影響索引?
寫操作可能需要更新索引:
- 如果寫入操作修改了索引字段,則MongoDB將更新所有鍵中包含該字段的索引。
因此,如果應用程序是大量寫入操作,則索引可能會影響性能。
刪除索引
示例:刪除名稱為name_1的索引
> db.test.dropIndex("name_1") { "nIndexesWas" : 2, "ok" : 1 }
示例:刪除所有索引
> db.inventory.dropIndexes()
集合中將_id字段自動設置為索引,刪除所有索引時,_id字段的索引不會刪除
浙公網安備 33010602011771號