天天看點

mongo學習筆記之索引

mongo學習筆記之索引

索引實際就是對指定字段進行排序的資料結構  。

基于B-Tree的結構提升查詢速度。(時間複雜度logn)

複合鍵索引可以對多個字段進行排序。複合鍵索引隻能支援字首子查詢

例如建立的複合查詢為(a,b,c),比對的時候隻能按照從左往右的形式,比如

(a),(a,b)但是不能對(b,c)或者(b)不能加速索引。

預設索引 _id

傳回值

查詢索引:db.collection.getIndexes()

建立複合鍵索引

多鍵索引

包含數組元組的字段建立索引。建立方法和單鍵的一緻。

存在大量資料的集合上建立索引是非常耗時的,而且在建立索引的時候,會阻塞所有的讀和寫請求,一直到索引建立完成。這個時候可以通過設定為在後端建立,指定background為true避免阻塞。

db.collection.explain()

看結果裡的

queryPlanner: 然後看winningPlan性能最好的執行方式,然後看stage字段

COLLSCAN(周遊整個集合)最不希望看到結果,效果最差的搜尋方式。

如果建立了索引

首先發現其stage為FETCH,然後下面會發現inputStage的stage為 IXSCAN(全稱index scan),根據索引查詢,這正是我們的目的,通過建立索引提高查詢效果。keyPattern字段可以看到對應的索引。indexName就是索引的名字。

如果隻傳回加了索引的字段效率會進一步提高。

winningPlan的stage為PROJECTION,然後inputStage的stage為 IXSCAN。

這種情況是最優的查詢效果了。

建立具有唯一性的索引

要求該字段不能出現重複值,如果想建立就必須删除重複的字段。如果文檔中沒有name字段,而對其建立了唯一性索引,再插入第一個文檔的時候會給index設定為null,然後在建立第二文檔的時候如果還沒有name字段,将報錯。

隻将包含索引鍵字段的文檔加入索引中(即使索引字段值為null),對于不含有索引字段的

文檔就不會再查詢了,大大降低了索引的存儲空間。

如果索引既有唯一性,又具有稀疏性,就可以儲存 多篇 缺失索引值的文檔了。

不會再出現上面唯一性說的報錯問題了。

針對日期字段,可以指定索引的時間,如果到時間自動删除索引。

在crawl_time字段上建立一個生存時間是20秒的索引。20s之後文檔會被删除。

但是這個特性隻适合單鍵索引,不适合複合鍵索引。

當索引鍵是包含日期元素的數組字段時,數組中最小的日期将被用來計算文檔是否已經過期。因為資料庫使用一個背景線程來檢測和删除過期的文檔,删除操作可能有一定的延遲。

如果經常對某個字段進行字元串的搜尋,為了提高速度可以使用該類型索引。

可以對一個集合的一個或者多個字段設定文本索引,但是一個集合隻能有一個文本索引。例如:

給name字段建立文本索引,結果正常。

發現出現錯誤:IndexOptionsConflict.

通過索引的名字删除索引以後重新插入一個含有上面兩個字段的複合索引。

發現可以成功插入。

db.stores.getIndexes()

得到索引的資訊,關鍵是name。

根據上面的name,進行删除

db.stores.dropIndex("name_text")

使用 <code>$text</code> 查詢操作符的前提,必須是在一個有 text index 的集合上執行文字檢索。

如果不存在文本索引會出現錯誤:text index required for $text query

<code>$text</code> 将會使用空格和标點符号(例如:逗号)作為分隔符對檢索字元串進行分詞, 并且對檢索字元串中所有的分詞結果進行一個邏輯上的 <code>OR</code> 操作。

例如,您可以使用下面的查詢語句來找到所有包含 “coffee”, “shop”, 以及 “java” 清單中任何詞語的商店:

本次查找是在整個集合中進行查找,通過explain可以檢視mongo查詢語句的速度

看到查詢狀态為IXSCAN,可以知道目前是最佳速度了。

如果查詢的字元串直接有空格,但是想完全比對可以使用雙引号。

記得将引号裡面字元串引号使用\轉義。

為了排除一個詞語,您可以在前面加上一個 “<code>-</code>” 字元。例如,為了找到所有包含 “java” 或者 “shop” 但是不包含 “coffee” 的商店,使用下面的指令:

聚合用的暫時不研究

http://www.mongoing.com/docs/text-search.html