• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • MongoDB——基礎——索引-Index(四)

    標簽: MongoDB  數據庫  mongodb

    1、概述

    索引支持在MongoDB中高效地執行查詢。如果沒有索引,MongoDB必須執行全集合掃描,即掃描集合中的每個文檔。這種掃描全集合的查詢效率是非常低的,特別在處理大量的數據時,查詢可以要花費幾十秒甚至幾分鐘。 如果查詢存在適當的索引,MongoDB可以使用該索引限制必須檢查的文檔數。

    索引是特殊的數據結構,它以易于遍歷的形式存儲集合數據集的一小部分。索引存儲特定字段或一組字段的值,按字段值排序。索引項的排序支持有效的相等匹配和基于范圍的查詢操作。此外,MongoDB還可以使用索引中的排序返回排序結果。MongoDB索引使用B樹數據結構(確切的說是B-Tree,MySQL是B+Tree)

    2、索引的類型

    (1)單字段索引

    MongoDB支持在文檔的單個字段上創建用戶定義的升序/降序索引,稱為單字段索引(Single Field Index)。

    對于單個字段索引和排序操作,索引鍵的排序順序(即升序或降序)并不重要,因為MongoDB可以在任何方向上遍歷索引。

    (2)復合索引

    MongoDB還支持多個字段的用戶定義索引,即復合索引(Compound Index)。

    復合索引中列出的字段順序具有重要意義。例如,如果復合索引由 { userid: 1, score: -1 } 組成,則索引首先按userid正序排序,然后在每個userid的值內,再在按score倒序排序。

    (3)其他索引

    地理空間索引(Geospatial Index)、文本索引(Text Indexes)、哈希索引(Hashed Indexes)。

    地理空間索引(Geospatial Index) 為了支持對地理空間坐標數據的有效查詢,MongoDB提供了兩種特殊的索引:返回結果時使用平面幾何的二維索引和返回結果時使用球面 幾何的二維球面索引。

    文本索引(Text Indexes) MongoDB提供了一種文本索引類型,支持在集合中搜索字符串內容。這些文本索引不存儲特定于語言的停止詞(例如“the”、“a”、“or”), 而將集合中的詞作為詞干,只存儲根詞。

    哈希索引(Hashed Indexes) 為了支持基于散列的分片,MongoDB提供了散列索引類型,它對字段值的散列進行索引。這些索引在其范圍內的值分布更加隨機,但只支 持相等匹配,不支持基于范圍的查詢。

    3、索引的管理操作

    (1)索引的查看

    //返回一個集合中的所有索引的數組。
    db.collection.getIndexes()
    

    默認_id索引:

    MongoDB在創建集合的過程中,在 _id 字段上創建一個唯一的索引,默認名字為 _id_,該索引可防止客戶端插入兩個具有相同值的文檔,不能在_id字段上刪除此索引。

    注意:該索引是唯一索引,因此值不能重復,即 _id 值不能重復的。在分片集群中,通常使用 _id 作為片鍵。

    (2)索引的創建

    //在集合上創建索引
    db.collection.createIndex(keys, options)

    1)單字段索引示例

    db.articles.createIndex({userid:1})

    查看索引

    db.articles.getIndexes()
    [
        {
            "v" : 2,
            "key" : {
                "_id" : 1
            },
            "name" : "_id_",
            "ns" : "articledb.articles"
        },
        {
            "v" : 2,
            "key" : {
            "userid" : 1
            },
            "name" : "userid_1",
            "ns" : "articledb.articles"
        }
    ]

     

    2)復合索引:

    對 userid 和 nickname 同時建立復合(Compound)索引:

     db.articles.createIndex({userid:1,nickname:-1})

    (3)索引的移除

    1)指定索引的移除

    db.collection.dropIndex(index)

    刪除 articles集合中 userid 字段上的升序索引:

    db.articles.dropIndex({userid:1})
    或者通過索引名稱刪除
    db.articles.dropIndex("userid_1")

    2)所有索引的移除

    db.articles.dropIndexes()

    注意: _id 的字段的索引是無法刪除的,只能刪除非 _id 字段的索引。

    4、索引的使用

    (1)執行計劃

    分析查詢性能(Analyze Query Performance)通常使用執行計劃(解釋計劃、Explain Plan)來查看查詢的情況,如查詢耗費的時間、是否基于索引查詢等。 如果想知道建立的索引是否有效,效果如何,都需要通過執行計劃查看。

    命令:db.collection.find(query,options).explain(options)

    > db.articles.find({userid:"1003"}).explain()
    
    {
        "queryPlanner" : {
            "plannerVersion" : 1,
            "namespace" : "articledb.articles",
            "indexFilterSet" : false,
            "parsedQuery" : {
                "userid" : {
                    "$eq" : "1003"
                }
            },
            "winningPlan" : {
                "stage" : "COLLSCAN",
                "filter" : {
                    "userid" : {
                        "$eq" : "1003"
                    }
                },
                "direction" : "forward"
            },
            "rejectedPlans" : [ ]
        },
        "serverInfo" : {
            "host" : "9ef3740277ad",
            "port" : 27017,
            "version" : "4.0.10",
            "gitVersion" : "c389e7f69f637f7a1ac3cc9fae843b635f20b766"
        },
        "ok" : 1
    }

    關鍵點看: "stage" : "COLLSCAN", 表示全集合掃描;"stage" : "IXSCAN" ,基于索引的掃描

    (2)涵蓋的查詢

    當查詢條件和查詢的投影僅包含索引字段時,MongoDB直接從索引返回結果,而不掃描任何文檔或將文檔帶入內存。 這些覆蓋的查詢可以非常有效。

    版權聲明:本文為qq_24757635原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/qq_24757635/article/details/108576177

    智能推薦

    MongoDB索引

    一、簡介 在MongoDB建立索引能提高查詢效率,如果沒有建立索引,在查詢時,MongoDB必須執行全表掃描,在數據量大時,效率差別就很明顯,對于包括一個沒有索引的排序操作的查詢,服務器必須在返回任何結果之前將所有的文檔加載到內存中來進行排序。 索引是特殊的數據結構, 索引存儲在一個易于遍歷讀取的數據集合中, 索引是對數據庫表中一列或多列的值進行排序的一種結構。 索引項的排序支持高效的相等匹配和基...

    MongoDB索引

    準備階段 插入10W條數據測試準備: MongoDB性能分析函數(explain) 查看索引 命名索引 刪除索引 創建索引 單鍵索引 創建索引性能對比: 唯一索引 重復的鍵值自然就不能插入 稀疏索引 沒有此字段的數據不建立索引,節約磁盤 組合索引 過期索引 在一段時間后會過期的索引 在索引過期后,相應的數據會被刪除 適合存儲在一段時間之后會失效的數據,比如用戶的登錄信息、存儲的日志等。 全文索引 ...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    猜你喜歡

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    Linux C系統編程-線程互斥鎖(四)

    互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...

    統計學習方法 - 樸素貝葉斯

    引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...

    styled-components —— React 中的 CSS 最佳實踐

    https://zhuanlan.zhihu.com/p/29344146 Styled-components 是目前 React 樣式方案中最受關注的一種,它既具備了 css-in-js 的模塊化與參數化優點,又完全使用CSS的書寫習慣,不會引起額外的學習成本。本文是 styled-components 作者之一 Max Stoiber 所寫,首先總結了前端組件化樣式中的最佳實踐原則,然后在此基...

    精品国产乱码久久久久久蜜桃不卡