學習mongodb,體會mongodb的每一個使用細節,歡迎閱讀威贊的文章。這是威贊發布的第85篇mongodb技術文章,歡迎瀏覽本專欄威贊發布的其他文章。如果您認為我的文章對您有幫助或者解決您的問題,歡迎在文章下面點個贊,或者關注威贊。謝謝。
通過在Mongodb添加索引,能夠提高Mongodb查詢效率。但在索引在使用當中也會有一些限制。本文結合官方文檔,介紹Mongodb索引使用上的一些限制。
每個集合的索引數量
單個集合當中,最多可以添加64個索引
復合索引字段數量
復合索引當中,最多包含32個字段
特殊索引查詢
用戶不可以將文本查詢$text中創建的索引與另外一種特殊類型的索引共同使用。如用戶不能夠共同使用$text查詢和$near操作符。
二維空間索引僅能包含地理信息數據
帶有二維空間索引的字段必須保存GeoJSON數據類型或者坐標值。如果用戶向二維空間索引字段插入其他類型的數據,或向包含其他數據類型的字段建立二維空間索引時,mongodb會報錯。
二維空間索引鍵數量限制
為了生成二維空間索引,mongodb將GeoJSON類型的數據匹配到mongodb內部的一種數據展現方式。這種數據匹配過程可能會生成一個特別大的數組。
而當mongodb為數組字段創建索引時,mongdb會為每一個數據元素創建一個索引鍵。對于復合索引,mongod計算為每個字段生成的鍵集的笛卡爾乘積。構建笛卡爾乘積的兩個數據集特別大時,數據計算的過程中可能會超過mongodb的內存限制。為了保證mongodb不會出現內存限制問題,mongodb使用參數indexMaxNumGeneratedKeysPerDocument 限制單個文檔生成索引時最大鍵的數量。默認值是100000.當構建索引時,超過這個限制數量,mongodb會報錯。
NaN值的處理
在索引覆蓋查詢中,使用WiredTiger引擎時,NaN的數字類型是double
多鍵索引
多鍵索引不能覆蓋不在相同數組的字段。
地理信息索引
地理信息索引不支持索引覆蓋查詢
索引構建時的內存使用
createIndexes方法支持在一個集合中建立一個或多個索引。這個方法在構建索引時結合使用內存和臨時文件。默認分配200Mb內存給createIndexes方法。當createIndexes方法創建多個索引時,構建多個索引過程中共用這200Mb的空間。當默認分配的創建索引內存空間被占滿是,mongodb使用臨時文件來繼續構建索引。這些臨時文件保存在--dbpath參數配置的路徑下的_tmp文件夾當中。用戶可以通過指定參數 maxIndexBuildMemoryUsageMegabytes 來修改這個默認的索引構建內存。分配更大的內存,會提高索引的構建效率。但過高的內存分配,可能會導致操作系統的內存使用過多,甚至服務重啟。
用戶通過createIndexes方法或者使用數據庫管理中的數據初始同步命令時,都會觸發索引構建。這些索引構建需要的內存大小,都是由參數maxIndexBuildMemoryUsageMegabytes指定的。單個集合的數據初始同步,沒有什么內存使用風險。但用戶很有可能同時觸發多個數據庫的數據初始同步,這樣的同步操作內存使用很有可能超過限制。
字符序和索引類型
文本索引和二維索引斤支持簡單的二進制比較,不支持字符序。
隱藏索引
用戶不可以隱藏默認的_id字段索引
用戶不可以在hint()方法中使用隱藏索引