Mongodb復合索引

學習mongodb,體會mongodb的每一個使用細節,歡迎閱讀威贊的文章。這是威贊發布的第90篇mongodb技術文章,歡迎瀏覽本專欄威贊發布的其他文章。如果您認為我的文章對您有幫助或者解決您的問題,歡迎在文章下面點個贊,或者關注威贊。謝謝。

在mongodb中,為集合添加單字段索引,能夠提高針對單個字段的查詢效率。但對于針對多個字段的查詢,要怎樣提高查詢效率呢?例如一個雜貨店的老板,想要通過查詢商品和剩余數量,來知道是否需要補貨。這里我們結合官方文檔,整理介紹mongodb的另一個索引類型,復合索引。

定義

復合索引是使用集合當中文檔兩個或多個字段構成的索引。索引中收集和排序了用戶指定的字段,按照用戶指定的順序,依次分組排序。

下圖展示了一個復合索引的結構。用戶使用userid正序和分數倒序建立的復合索引。在mongodb索引當中,先按照userid字母表順序正序排列,然后在每一個userid下面,分數按照倒序來排列。

在通用的查詢字段上添加索引,能夠增加索引覆蓋查詢的機會。索引覆蓋查詢是只能夠完全使用索引來執行的查詢,不需要掃描文檔數據來返回結果。

語法

db.<collection>.createIndex( {<field1>: <sortOrder>,<field2>: <sortOrder>,……<fieldN>: <sortOrder>,
})

限制

  • 單個復合索引,最多包含32個字段
  • 索引中字段排序影響復合索引的效率。復合索引中包含了依據用戶定義的字段順序所創建的文檔引用。
  • 復合索引按照正序或倒序的順序,保存指定字段值。而這種排序順序,能夠決定查詢是否支持索引排序。
  • 復合索引可以包含一個哈希索引字段

復合索引前綴查詢

索引前綴查詢表示使用索引字段中的前面部分字段來進行的索引查詢。mongodb的復合索引,支持這樣的前綴查詢。

考慮這樣的索引

{"item": 1, "location": 1, "stock": 1}

該索引當中,包含兩個索引前綴

{"item": 1}
{"item": 1, "location": 1}

則該索引,能夠支持下面的字段組合查詢

    • item
    • item + location
    • item + location + stock

mongodb也可以使用這個索引支持item + stock這兩個字段的查詢。但只有item字段使用了這個索引,stock查詢條件無法使用這個索引。因為構建索引時, stock字段跟隨在location字段后。索引數據數據中,stock字段值排列在location字段的分組中。索引字段按照建立索引時字段順序解析。如果一個查詢跳過了索引前綴,則無法使用索引。如上述索引,無法支持下面幾個字段的查詢

    • location
    • stock
    • location + stock

缺少了item字段,這些查詢都無法使用該索引。

特殊復合索引

復合索引能夠包含不同類型的特殊索引。索引類型的組合方式,能夠決定索引匹配文檔的方式。

下面的表格展示了包含不同特殊索引的復合索引構建行為。

復合索引構成

復合索引行為

正序索引

倒序索引

為包含指定字段的文檔建立索引

正序索引

倒序索引

地理位置索引

只能為包含地理位置的文檔建立索引

正序索引

倒序索引

文本索引

只能為包含文檔字段的文檔建立索引

應用

構建集合students并插入數據

db.students.insertMany([{"name": "Alice","gpa": 3.6,"location": { city: "Sacramento", state: "California" }},{"name": "Bob","gpa": 3.2,"location": { city: "Albany", state: "New York" }}
])

為name字段和gpa字段添加復合索引。索引中按照name字段的正序排列,gpa字段的倒序排列

db.students.createIndex({name: 1,gpa: -1
})

該索引能夠支持針對name和gpa兩個字段的查詢,也能夠支持name字段的查詢,因為name字段是該索引的索引前綴。

db.students.find({name: 'Alice',gpa: 3.6
})db.students.find({name: 'Bob'
})

該索引不支持僅包括gpa字段的查詢,如

db.students.find({ gpa: { $gt: 3.5}})

因為gpa字段,沒有在該索引的前綴當中。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/45455.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/45455.shtml
英文地址,請注明出處:http://en.pswp.cn/web/45455.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【計算機畢業設計】002基于weixin小程序家庭記賬本

&#x1f64a;作者簡介&#xff1a;擁有多年開發工作經驗&#xff0c;分享技術代碼幫助學生學習&#xff0c;獨立完成自己的項目或者畢業設計。 代碼可以私聊博主獲取。&#x1f339;贈送計算機畢業設計600個選題excel文件&#xff0c;幫助大學選題。贈送開題報告模板&#xff…

【實戰:python-Django發送郵件-短信-釘釘通知】

一 Python發送郵件 1.1 使用SMTP模塊發送郵件 import smtplib from email.mime.text import MIMEText from email.header import Headermsg_from 306334678qq.com # 發送方郵箱 passwd luzdikipwhjjbibf # 填入發送方郵箱的授權碼(填入自己的授權碼&#xff0c;相當于郵箱…

鴻蒙語言基礎類庫:【@ohos.uitest (UiTest)】 測試

UiTest UiTest提供模擬UI操作的能力&#xff0c;供開發者在測試場景使用&#xff0c;主要支持如點擊、雙擊、長按、滑動等UI操作能力。 該模塊提供以下功能&#xff1a; [By]&#xff1a;提供控件特征描述能力&#xff0c;用于控件篩選匹配查找。[UiComponent]&#xff1a;代…

實驗四:圖像的銳化處理

目錄 一、實驗目的 二、實驗原理 1. 拉普拉斯算子 2. Sobel算子 3. 模板大小對濾波的影響 三、實驗內容 四、源程序和結果 (1) 主程序(matlab) (2) 函數GrayscaleFilter (3) 函數MatrixAbs 五、結果分析 1. 拉普拉斯濾波 2. Sobel濾波 3. 不同大小模板的濾波…

單點登陸思路及流程

單點登錄&#xff08;Single Sign-On&#xff0c;簡稱SSO&#xff09;是一種流行的身份驗證和授權機制&#xff0c;允許用戶通過一次登錄獲得對多個應用程序或系統的訪問權限。實現單點登錄可以提高用戶體驗、簡化用戶管理和減少密碼重復輸入等問題。下面是一種常見的單點登錄實…

昇思25天學習打卡營第7天 | 基于MindSpore的GPT2文本摘要

本次打卡基于gpt2的文本摘要 數據加載及預處理 from mindnlp.utils import http_get# download dataset url https://download.mindspore.cn/toolkits/mindnlp/dataset/text_generation/nlpcc2017/train_with_summ.txt path http_get(url, ./)from mindspore.dataset impor…

以太坊(以太坊solidity合約)

以太坊&#xff08;以太坊solidity合約&#xff09; 1&#xff0c;以太坊2&#xff0c;開發名詞解釋&#xff08;1&#xff09;錢包&#xff08;2&#xff09;Solidity&#xff08;3&#xff09;Ether&#xff08;以太幣&#xff09;&#xff08;4&#xff09;Truffle&#xff…

Redis 7.x 系列【23】哨兵模式

有道無術&#xff0c;術尚可求&#xff0c;有術無道&#xff0c;止于術。 本系列Redis 版本 7.2.5 源碼地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目錄 1. 概述2. 工作原理2.1 監控2.2 標記下線2.3 哨兵領袖2.4 新的主節點2.5 通知更新 3. …

請求響應(后端必備)

一、請求 1.簡單參數 原始方式&#xff1a; 在原始的web程序中&#xff0c;獲取請求參數&#xff0c;需要通過HttpServletRequest對象手動獲取 RequestMapping("/simpleParam")public String simpleParam(HttpServletRequest request){String name request.getP…

什么叫價內期權?直接帶你了解期權價內期權怎么使用?!

今天帶你了解什么叫價內期權&#xff1f;直接帶你了解期權價內期權怎么使用&#xff1f;&#xff01;價內期權是具有內在價值的期權。期權持有人行權時&#xff0c;對看漲期權而言&#xff0c;行權價格低于標的證券結算價格&#xff1b;對看跌期權而言&#xff0c;標的證券結算…

js 請求blob:https:// 圖片

方式1 def get_file_content_chrome(driver, uri):result driver.execute_async_script("""var uri arguments[0];var callback arguments[1];var toBase64 function(buffer){for(var r,nnew Uint8Array(buffer),tn.length,anew Uint8Array(4*Math.ceil(t/…

前端Vue組件化實踐:自定義加載組件的探索與應用

在前端開發領域&#xff0c;隨著業務邏輯復雜度的提升和系統規模的不斷擴大&#xff0c;傳統的開發方式逐漸暴露出效率低下、維護困難等問題。為了解決這些挑戰&#xff0c;組件化開發作為一種高效、靈活的開發模式&#xff0c;受到了越來越多開發者的青睞。本文將結合實踐&…

Java基礎及進階

JAVA特性 基礎語法 一、Java程序的命令行工具 二、final、finally、finalize 三、繼承 class 父類 { //代碼 }class 子類 extends 父類 { //代碼 }四、Vector、ArrayList、LinkedList 五、原始數據類型和包裝類 六、接口和抽象類 JAVA進階 Java引用隊列 Object counter ne…

PostgreSQL行級安全策略探究

前言 最近和朋友討論oracle行級安全策略(VPD)時&#xff0c;查看了下官方文檔&#xff0c;看起來VPD的原理是針對應用了Oracle行級安全策略的表、視圖或同義詞發出的 SQL 語句動態添加where子句。通俗理解就是將行級安全策略動態添加為where 條件。那么PG中的行級安全策略是怎…

搭建基于 ChatGPT 的問答系統

搭建基于 ChatGPT 的問答系統 &#x1f4e3;1.簡介&#x1f4e3;2.語言模型&#xff0c;提問范式和 token?2.1語言模型?2.2Tokens?2.3Helper function輔助函數&#xff08;提問范式&#xff09; &#x1f4e3;3.評估輸入-分類&#x1f4e3;4.檢查輸入-審核?4.1審核4.1.1 我…

使用UDP通信接收與發送Mavlink2.0協議心跳包完整示例

1.克隆mavlink源碼 https://github.com/mavlink/mavlink.git 2.進入mavlink目錄,安裝依賴 python3 -m pip install -r pymavlink/requirements.txt 3.生成Mavlink的C頭文件 mavlink % python3 -m pymavlink.tools.mavgen --lang=C --wire-protocol=2.0 --output=generated…

1-5歲幼兒胼胝體的表面形態測量

摘要 胼胝體(CC)是大腦中的一個大型白質纖維束&#xff0c;它參與各種認知、感覺和運動過程。盡管CC與多種發育和精神疾病有關&#xff0c;但關于這一結構的正常發育(特別是在幼兒階段)還有很多待解開的謎團。雖然早期文獻中報道了性別二態性&#xff0c;但這些研究的觀察結果…

【Linux網絡】select{理解認識select/select與多線程多進程/認識select函數/使用select開發并發echo服務器}

文章目錄 0.理解/認識回顧回調函數select/pollread與直接使用 read 的效率差異 1.認識selectselect/多線程&#xff08;Multi-threading&#xff09;/多進程&#xff08;Multi-processing&#xff09;select函數socket就緒條件select的特點總結 2.select下echo服務器封裝套接字…

C++ 類和對象 賦值運算符重載

前言&#xff1a; 在上文我們知道數據類型分為自定義類型和內置類型&#xff0c;當我想用內置類型比較大小是非常容易的但是在C中成員變量都是在類(自定義類型)里面的&#xff0c;那我想給類比較大小那該怎么辦呢&#xff1f;這時候運算符重載就出現了 一 運算符重載概念&…