MongoDB實戰指南 二 索引與查詢優化

2021-09-08 17:44:31 字數 2541 閱讀 9283

資料庫儲存記錄的機制是建立在檔案系統上的,索引也是以檔案的形式儲存在磁碟上,在資料庫中用到最多的索引結構就是b樹。儘管索引在資料庫領域是不可缺少的,但是對乙個表建立過多的索引會帶來一些問題,索引的建立要花費系統時間,同時索引檔案也會占用磁碟空間。如果併發寫入的量很大,每個插入的文件都要建立索引,可想而知,效能會較低。因此合理的建立索引是關鍵,搞清楚哪些字段上面需要建立索引,索引以什麼樣的方式建立,我們需要對每個查詢過程進行分析,才能得出合理的結論。

在mongodb上面,索引能夠提高讀操作及查詢效能。沒有索引,mongodb必須掃瞄集合中的每乙個文件,然後選擇與查詢條件匹配的文件,這種全表掃瞄的方式是非常低效的。mongodb索引的資料結構也是b+樹,它能夠儲存一小部分集合的資料,集體來說就是儲存集合中建有索引的乙個或多個欄位的值,而且按照值的公升序或者降序排列。對於乙個查詢來說,如果存在合適的索引,mongodb能夠利用這個索引減少文件的掃瞄數量,甚至對於某些查詢能夠直接從索引中返回結果,不需要再去掃瞄資料集合,這種查詢是非常高效的。

1.1 單字段索引

mongodb預設為所有集合都建立了乙個_id欄位的單字段索引,而且這個索引是唯一的,不能被刪除,_id欄位作為乙個集合的主鍵,值是唯一的,對於乙個集合來說,也可以在其他欄位上建立單字段的唯一索引,如下面所述。

先插入一些資料:

> for(var i=1;i<10;i++))}

> for(var i=1;i<10;i++))}

> for(var i=1;i<10;i++))}

> for(var i=1;i<10;i++))}

> for(var i=1;i<10;i++))}

下面建立單字段唯一索引

> db.customers.ensureindex(,)

單字段唯一索引去掉選項就是乙個普通的單字段索引。

唯一索引建立成功後,會在相應資料庫的系統集合system.indexs中增加一條索引記錄,如下所示:

> db.system.indexes.find()

最後一條畫紅線的是剛剛新增的唯一索引。索引記錄中v表示索引的版本;key表示索引建立在哪個欄位上;1表示索引按照公升序排列;索引記錄所在的命名空間,name表示唯一索引的名稱。唯一索引與普通索引的區別是要求插入的所有記錄在建立索引的鍵值上唯一。

下面執行查詢,乙個用索引字段作為查詢選擇器;乙個不用索引字段作為查詢選擇器進行比較。

> db.customers.find().explain()

以上查詢語句執行返回的結果用到了剛剛建立的索引:

> db.customers.find().explain()

以上查詢語句執行返回的結果沒有用到剛剛建立的索引。

1.2 復合索引

mongodb支援多個欄位的復合索引,復合索引支援匹配多個欄位的查詢。

給上面插入的資料建立乙個復合索引:

> db.customers.ensureindex()

1.3 陣列的多鍵索引

如果對乙個值為陣列型別的字段建立索引,則會預設對陣列中的每乙個元素建立索引。

1.4 索引管理

通過上面建立的索引可以看到,索引記錄都儲存在特殊的集合system.indexs中。建立索引的語法如下所示:

>db.collection.ensureindex(keys,options)

keys是乙個document文件,包含需要新增索引的字段和索引的排序方向;option是可選引數,控制索引的建立方式。

索引的刪除並不是直接找到索引所在的集合system.indexs,通過在集合上執行remove命令來刪除,而是通過執行集合上的命令dropindex來刪除的。例如刪除上面建立的如下復合索引。

> db.customers.dropindex("name_1_country_1")

其中引數為索引的名稱。

查詢優化的目的是找出慢的查詢語句,分析慢的原因,然後優化此查詢語句。

mongodb對於超過100ms的查詢語句,會自動地輸出到日誌檔案裡面,因此找出慢查詢的第一步是檢視mongodb的日誌檔案,如果覺得這100ms閾值過大,可以通過mongod的服務啟動選項showms來設定,它的預設值是100ms。

用上面的方法找出慢查詢可能比較粗糙,第二種定位慢查詢的方法是開啟資料庫的監視功能,它預設是關閉的,可以通過下面的命令開啟。

db.setprofilinglevel(level,[slowms])

引數level是監視級別,值為0表示關閉資料庫的監視功能,為1表示只記錄慢查詢,為2表示記錄所有操作;slown為可選引數,設定慢查詢的閾值。

所有監視的結果都將儲存到乙個特殊的集合systemn.profile中。

通過上面的兩種方法可以找出慢查詢的語句,然後通過建立相應的索引基本可以解決絕大部分的問題。但是有時我們需要更加精細的優化**,這就需要分析這些慢查詢的執行計畫,檢視查詢是否用到索引,是否與我們想要的執行計畫相同,用mongodb的explian命令可以檢視執行計畫。

mongodb中的索引二

通常mongodb中的索引的建立方式如下 這種方式下,已經排好順序了,所以只要在排好序的key中找滿足查詢條件的記錄即可,需要掃瞄的資料量比較大,還有一種索引的建立方式 這種建立的方式中,不需要掃瞄很多的記錄,在索引中查詢滿足條件的記錄,但是需要在記憶體中排序,如果滿足記錄的條件很多,就要消耗很多的...

MongoDB的索引與執行計畫

目錄索引 執行計畫 索引通常能夠極大的提高查詢的效率,如果沒有索引,mongodb在讀取資料時必須掃瞄集合中的每個檔案並選取那些符合查詢條件的記錄。這種掃瞄全集合的查詢效率是非常低的,特別在處理大量的資料時,查詢可以要花費幾十秒甚至幾分鐘,這對 的效能是非常致命的。索引是特殊的資料結構,索引儲存在乙...

MongoDB實戰(3)固定集合與GridFS

常見用處 實際案例 下面我們建立乙個集合 這是乙個最多10行記錄的固定集合。當我們插入10條記錄後,再有新的插入時,最老的一條將會被剔除,看看如下效果 檢視以使用多少空間 上 述 的 createcollection 函 數 也 可 以 用 來 創 建 一 般 的 collection 還 有 一 ...