<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [TOC] ### 創建1 000 000個文檔的集合 ***** ``` for?(i=0;?i<1000000;?i++)?{ ?db.users.insert( ????????{ ?????????????"i"?:?i, ?????????????"username"?:?"user"+i, ?????????????"age"?:?Math.floor(Math.random()\*120), ?????????????"created"?:?new?Date() ?????????} ?????); ?} ``` ### 不建立索引查詢 ***** 執行查詢語句 ```MongoDB db.users.find({username:?"user101"}).explain() ``` 注意:`explain()`函數查看MongoDB在執行查詢的過程中所做的事情; 這個集合中的每個文檔都被掃描過了。也就是說,為了完成這個查詢,MongoDB查看了每一個文檔中的每一個字段. 為了優化查詢,將查詢結果限制為1,這樣MongoDB在找到一個文檔之后就會停止了: ``` db.users.find({username:?"user101"}).limit(1).explain() ``` >現在,所掃描的文檔數量極大地減少了,而且整個查詢幾乎是瞬間完成的。但是,這個方案是不現實的:如果要查找的是user999999呢?我們仍然不得不遍歷整個集合,而且,隨著用戶的增加,查詢會越來越慢。 ### 建立單個字段索引 ***** 給`username`字段建立正序索引 ``` >?db.users.ensureIndex({"username"?:?1}) //倒序索引 > db.users.ensureIndex({"username"?:?-1}) ``` 執行查詢語句: ``` > db.users.find({"username"?:?"user101"}).explain() ``` 可以看到,這個查詢現在幾乎是瞬間完成的(甚至可以更好),而且對于任意username的查詢,所耗費的時間基本一致。 ### 復合索引 ***** 在下面的排序里,"username"上的索引沒什么作用: ``` db.users.find().sort({"age"?:?1,?"username"?:?1}) ``` 先根據"age"排序再根據"username"排序,所以"username"在這里發揮的作用并不大。為了優化這個排序,可能需要在"age"和"username"上建立索引: ``` >?db.users.ensureIndex({"age"?:?1,?"username"?:?1}) ``` 這樣就建立了一個**復合索引** 如果使用{"age" : 1, "username" : 1}建立索引,索引大致會是這個樣子: ``` [0, "user100309"] -> 0x0c965148 [0, "user100334"] -> 0xf51f818e [0, "user100479"] -> 0x00fd7934 ... [0, "user99985" ] -> 0xd246648f [1, "user100156"] -> 0xf78d5bdd [1, "user100187"] -> 0x68ab28bd [1, "user100192"] -> 0x5c7fb621 ... [1, "user999920"] -> 0x67ded4b7 [2, "user100141"] -> 0x3996dd46 [2, "user100149"] -> 0xfce68412 [2, "user100223"] -> 0x91106e23 ... ``` MongoDB對這個索引的使用方式取決于查詢的類型。下面是三種主要的方式: 1.查找單個值 ``` //MongoDB能夠直接定位到正確的年齡,而且不需要對結果進行排序 > db.users.find({"age" : 21}).sort({"username" : -1}) ``` 2. 多值查詢 ``` //查找到多個值相匹配的文檔(在本例中,年齡必須介于21到30之間)。MongoDB會使用索引中的第一個鍵"age"得到匹配的文檔 > db.users.find({"age" : {"$gte" : 21, "$lte" : 30}}) ``` 匹配的文檔如下: ``` [21, "user100000"] -> 0x37555a81 [21, "user100069"] -> 0x6951d16f [21, "user1001"] -> 0x9a1f5e0c [21, "user100253"] -> 0xd54bd959 [21, "user100409"] -> 0x824fef6c [21, "user100469"] -> 0x5fba778b ... [30, "user999775"] -> 0x45182d8c [30, "user999850"] -> 0x1df279e9 [30, "user999936"] -> 0x525caa57 ``` 多值查詢: ``` //與上一個類似,只是這次需要對查詢結果進行排序。跟之前一樣 > db.users.find({"age" : {"$gte" : 21, "$lte" : 30}}).sort({"username":1}) ``` 然而,使用這個索引得到的結果集中"username"是無序的,而查詢要求結果以"username"升序排列,所以MongoDB需要先在內存中對結果進行排序,然后才能返回。因此,這個查詢通常不如上一個高效。 >注意:如果結果集的大小超過32 MB,MongoDB就會出錯,拒絕對如此多的數據進行排序: #### 選擇鍵的方向 1. 如果應用程序同時需要按照{"age" : 1, "username" : 1}優化排序,我們還需要創建一個這個方向上的索引。至于索引使用的方向,與排序方向相同。 2. 如果有一個基于{"age" : -1}的排序和一個基于{"age" : 1}的索引,MongoDB會在使用索引時進行優化,就如同存在一個{"age" : -1}索引一樣。不要創建兩個這樣的索引。 3. 只有在基于多鍵排序時,方向才變得重要 #### 使用覆蓋索引(covered index) ` ` ### 多鍵索引 ***** MongoDB使用`多鍵索引`來索引存儲在數組中的內容.如果您對保存數組值的字段建立索引,則MongoDB將為數組的*每個*元素創建單獨的索引條目,這些多鍵索引允許查詢通過匹配數組的一個或多個元素來選擇包含數組的文檔. 如果索引字段包含數組值,MongoDB會自動確定是否創建多鍵索引. 您無需顯式指定多鍵類型. ### 空間索引 ***** 為了支持對地理空間坐標數據的高效查詢,MongoDB提供了兩個特殊的索引:返回結果時使用平面幾何的[2d索引](https://s0docs0mongodb0com.icopy.site/manual/core/2d/)和使用球面幾何返回結果的[2dsphere索引](https://s0docs0mongodb0com.icopy.site/manual/core/2dsphere/). ### text索引 ***** MongoDB提供了一種`text`索引類型,該類型支持在集合中搜索字符串內容. 這些文本索引不存儲特定于語言的*停用*詞(例如" the"," a"," or"),并且在集合中*詞干*僅存儲根詞. ### 散列索引(Hashed Indexes) ***** 為了支持[基于散列的分片](https://s0docs0mongodb0com.icopy.site/manual/core/hashed-sharding/#sharding-hashed-sharding),MongoDB提供了一種[散列索引](https://s0docs0mongodb0com.icopy.site/manual/core/index-hashed/)類型,該索引類型對字段值的散列進行索引. 這些索引在其范圍內具有更隨機的值分布,但*僅*支持相等匹配,而不能支持基于范圍的查詢. ### 唯一索引 ***** 索引的[unique](https://s0docs0mongodb0com.icopy.site/manual/core/index-unique/)屬性使MongoDB拒絕索引字段的重復值. 除了唯一約束之外,唯一索引在功能上可以與其他MongoDB索引互換. ### 部分索引 ***** [部分索引](https://s0docs0mongodb0com.icopy.site/manual/core/index-partial/)僅索引集合中符合指定過濾器表達式的文檔. 通過索引集合中文檔的子集,部分索引具有較低的存儲需求,并降低了索引創建和維護的性能成本. 部分索引提供了稀疏索引功能的超集,應優先于稀疏索引. ### 稀疏索引 ***** 索引的[稀疏](https://s0docs0mongodb0com.icopy.site/manual/core/index-sparse/)屬性可確保索引僅包含具有索引字段的文檔的條目. 索引會跳過*沒有*索引字段的文檔. 您可以將`稀疏索引`選項與`唯一索引`選項`結合使用`,以防止插入索引字段具有重復值的文檔,并跳過缺少索引字段的索引文檔. ### TTL 索引 ***** [TTL索引](https://s0docs0mongodb0com.icopy.site/manual/core/index-ttl/)是MongoDB可以使用的特殊索引,可以`在一定時間后自動從集合中刪除文檔`. 對于某些類型的信息(例如機器生成的事件數據,日志和會話信息),它們僅需要在數據庫中保留有限的時間,這是理想的選擇. ### 索引限制 ***** 內存RAM使用: ``` 由于索引是存儲在內存(RAM)中,你應該確保該索引的大小不超過內存的限制。 如果索引的大小大于內存的限制,MongoDB會刪除一些索引,這將導致性能下降。 ``` 最大范圍 ``` * 集合中索引不能超過64個 * 索引名的長度不能超過125個字符 * 一個復合索引最多可以有31個字段 ``` ### **索引最左前綴原則** *****
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看