摘要:栗子在沒有索引的情況下查詢全部北京車牌號碼返回結果如下哭表示全文檢索。該數據集包含了數據,其中屬于北京車牌。栗子添加索引因為我們只是需要得到北京市的車牌號碼,所以在我們的例子中涉及到了個索引信息,一個是城市另外一個就是車牌號碼。
本來是打算回答一個網友的問題,不過回復框太小而且功能不全(差評^o^),于是乎就成就了本文的產生。在這里我主要就是想跟大家分享一下我對Mongodb索引的粗淺理解,拋磚引玉,希望能對一些人有所幫助。
對于數據庫的索引相信大家都不陌生,主要功能就是在數據庫內提高針對特定信息的訪問速度。那么在Mongodb里面索引是怎樣被引用跟查找的呢?下面我來通過幾個例子給大家分享一下我的心得體會。
Mongodb基礎數據查詢舉個栗子,按照城市查詢車牌號碼系統。為了方便演示,我在所有查詢后面都加入了explain()函數。要注意explain的返回結果集中的一下選項:
cursor - 索引項
n - 查詢結果的條目總數
nscanned - 掃描并讀取的索引條目數(index)
nscannedObjects - 掃描并讀取的全文條目數(documents)
indexOnly - 是否使用了covered indexes功能,寶寶不哭,后面有詳述。
millis - 查詢用時,單位是毫秒。
db.carLicence.find({city:"Beijing"}).explain() //返回結果如下: { "cursor" : "BasicCursor", "n" : 1563247, "nscannedObjects" : 96539732, "nscanned" : 96539732, "indexOnly" : false, "millis" : 156, // 哭! }
BasicCursor表示全文檢索。上面的例子說明,在沒有索引的情況下,該查詢語句查詢了整個數據集carLicence。該數據集包含了96539732數據,其中1563247屬于北京車牌。整個用時為156毫秒.
小結: 一定要避免沒有索引的全文查詢
db.carLicence.find({city:"Beijing"}).limit(1000).explain() //返回結果如下: { "cursor" : "BasicCursor", "n" : 1000, "nscannedObjects" : 18476396, "nscanned" : 18476396, "indexOnly" : false, "millis" : 85, // 擦干眼淚! }
這個例子說明,Mongodb在搜索滿1000個條目之后就停止繼續檢索了。
小結: 盡量使用limit()來處理你的數據查詢。
因為我們只是需要得到北京市的車牌號碼,所以在我們的例子中涉及到了2個索引信息,一個是城市city,另外一個就是車牌號碼licence。那么我們來給這2個信息添加索引,來查詢全部北京車牌號碼。
db.carLicence.find({city:"Beijing"}).explain() //返回結果如下: { "cursor" : "BasicCursor city_1_licence_1", "n" : 1563247, "nscannedObjects" : 1563247, "nscanned" : 1563247, "indexOnly" : false, "millis" : 47, // 只剩 擦! }
相信看到這里,大家已經對所有的功效有了一個初步的認識了。
小結 - 盡量給涉及到的條目建立索引。
那么,indexOnly的covered indexes功能會有什么樣的提高呢?好讓我們來看最后這個例子。
db.carLicence.find({city:"Beijing"}, {licence:1, _id:0}).explain() //返回結果如下: { "cursor" : "BasicCursor city_1_licence_1", "n" : 1563247, "nscannedObjects" : 0, "nscanned" : 1563247, "indexOnly" : true, // 變了 變了 ! "millis" : 41, // 擦!擦!擦! }
最后這個例子涉及到了covered indexes(覆蓋索引),通常來說,覆蓋索引只在查詢文檔的索引字段時候使用。但是有幾個特性跟附加條件要遵循.
查詢字段必須是索引字段
要去掉_id因為是返回的Object. 通過_id:0來實現。
索引字段不能是. 也就是說在explain()里面,如果isMultiKey:true的話indexOnly一定是false.
另外一個就是在最后一個栗子里面nscannedObjects是零,這是因為我們只是提取了索引里面的目錄條licence,并不需要每一條的全部數據(document),加上"indexOnly" : true,所以, Mongodb直接從索引里面提取了數據licence,不用再去查詢物理數據集carLicence得到相關全文信息。所以nscannedObjects為零。
小結 - 在只提單字段數據的前提下,要給對應的但字段建立索引索引。
結語粗淺的分析一下我對索引的理解跟一些優化體驗。有興趣的朋友可以共通研究。最后說一句,善用explain()能對你的優化查詢有很大的益處。加油!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/18842.html
摘要:作為面試官,我是如何甄別應聘者的包裝程度語言和等其他語言的對比分析和主從復制的原理詳解和持久化的原理是什么面試中經常被問到的持久化與恢復實現故障恢復自動化詳解哨兵技術查漏補缺最易錯過的技術要點大掃盲意外宕機不難解決,但你真的懂數據恢復嗎每秒 作為面試官,我是如何甄別應聘者的包裝程度Go語言和Java、python等其他語言的對比分析 Redis和MySQL Redis:主從復制的原理詳...
摘要:作為面試官,我是如何甄別應聘者的包裝程度語言和等其他語言的對比分析和主從復制的原理詳解和持久化的原理是什么面試中經常被問到的持久化與恢復實現故障恢復自動化詳解哨兵技術查漏補缺最易錯過的技術要點大掃盲意外宕機不難解決,但你真的懂數據恢復嗎每秒 作為面試官,我是如何甄別應聘者的包裝程度Go語言和Java、python等其他語言的對比分析 Redis和MySQL Redis:主從復制的原理詳...
摘要:今天整理了一下近大半年以來的一些文章,和我的預期一樣,很多文章我都忘記自己曾經寫過了,這個記錄的過程讓我也有了新的理解。希望大家,收藏,點贊,加轉發。 今天整理了一下近大半年以來的一些文章,和我的預期一樣,很多文章我都忘記自己曾經寫過了,這個記錄的過程讓我也有了新的理解。希望大家,收藏,點贊,加轉發。 面試必備 面試必備:深入Spring MVC DispatchServlet 源碼...
摘要:今天整理了一下近大半年以來的一些文章,和我的預期一樣,很多文章我都忘記自己曾經寫過了,這個記錄的過程讓我也有了新的理解。希望大家,收藏,點贊,加轉發。 今天整理了一下近大半年以來的一些文章,和我的預期一樣,很多文章我都忘記自己曾經寫過了,這個記錄的過程讓我也有了新的理解。希望大家,收藏,點贊,加轉發。 面試必備 面試必備:深入Spring MVC DispatchServlet 源碼...
閱讀 663·2023-04-26 02:03
閱讀 1037·2021-11-23 09:51
閱讀 1111·2021-10-14 09:42
閱讀 1738·2021-09-13 10:23
閱讀 927·2021-08-27 13:12
閱讀 839·2019-08-30 11:21
閱讀 1001·2019-08-30 11:14
閱讀 1041·2019-08-30 11:09