天天看點

關于MongoDB 固定集合(capped collection)的知識梳理

一 . 什麼是固定集合

MongoDB中有一種特殊類型的集合,值得我們特别留意,那就是固定集合(capped collection)。

固定集合可以聲明collection的容量大小,其行為類似于循環隊列。資料插入時,新文檔會被插入到隊列的末尾,如果隊列已經被占滿,那麼最老的文檔會被之後插入的文檔覆寫。

固定集合的優點

1.寫入速度提升。固定集合中的資料被順序寫入磁盤上的固定空間,是以,不會因為其他集合的一些随機性的寫操作而“中斷”,其寫入速度非常快(不建立索引,性能更好)。

2.固定集合會自動覆寫掉最老的文檔,是以不需要再配置額外的工作來進行舊文檔删除。設定Job進行舊文檔的定時删除容易形成性能的壓力毛刺。

 固定集合非常實用與記錄日志等場景。

二 . 固定集合的建立

不同于普通集合,固定集合必須在使用前顯式建立。

例如,建立固定集合coll_testcapped,大小限制為1024個位元組。

db.createCollection("coll_testcapped",{capped:true,size:1024});

除了大小,建立時還可以指定固定集合中文檔的資料量。

例如,建立固定集合coll_testcapped,大小限制為1024個位元組,文檔數量 限制為100。

db.createCollection("coll_testcapped2",{capped:true,size:1024,max:100});

建立固定集合還有另一途徑,就是将普通集合裝換為固定集合,使用的指令是 convertToCapped。

例如将testcol1集合轉換為一個大小為1024位元組的固定集合:

db.runCommand({"convertToCapped":"testcol1","size":1024})

三 . 固定集合資訊的檢視

(1)判斷集合是否為固定集合,其判定指令為:

       db.集合.isCapped()。

     例如判斷前面已建立的固定集合coll_testcapped2是否為固定集合:

關于MongoDB 固定集合(capped collection)的知識梳理

(2) 從集合資訊中擷取 有關固定集合的屬性,檢視集合的指令為:

         db.集合.stats()

       例如檢視集合coll_testcapped2的資訊:

關于MongoDB 固定集合(capped collection)的知識梳理

四 . 注意事項:

(1)  固定集合建立之後就不可以改變,隻能将其删除重建。

(2)  普通集合可以使用 convertToCapped轉換固定集合,但是固定集合不可以轉換為普通集合。

(3)  建立固定集合,為固定集合指定文檔數量限制時(指參數max),必須同時指定固定集合的大小(指參數size)。不管先達到哪一個限制,之後插入的新文檔都會把最老的文檔移除集合。

(4)  使用 convertToCapped指令将普通集合轉換固定集合時,既有的索引會丢失,需要手動建立。并且,此轉換指令沒有限制文檔數量的參數(即沒有max的參數選項)。

(5)  不可以對 固定集合 進行分片。

(6)  對固定集合中的文檔可以進行更新(update)操作,但更新不能導緻文檔的Size增長或縮小,否則更新失敗。

           假如集合中有一個key,其value 對應的資料長度為100個位元組,如果要更新這個key 對應的value,更新後的值也必須為100個位元組,大于100個位元組不可以,小于100個位元組也不可以。

           報錯資訊為:Cannot change the size of a document in a capped collection : XXXX(XXXX代表某個資料字) !=XXXX。

(7)  不可以對固定集合執行删除文檔操作,但可以删除整個集合。

           删除文檔時,報錯資訊為:cannot remove from a capped collection:XXXX

(8)  還有一定需要注意,對集合估算size時,不要依據集合的storageSize ,而是依據集合的size。storageSize是wiredTiger存儲引擎采用高壓縮算法壓縮後的。

           例如通過db.集合.stats()指令檢視某集合的資料,"size" 和 "storageSize" 二者相差還是很大的。

關于MongoDB 固定集合(capped collection)的知識梳理

(9) 在 2.2 版本以後,建立的Capped Collection 預設在  _id 字段上建立索引,而在 2.2 版本或以前沒有。 

 本文版權歸作者所有,未經作者同意不得轉載,謝謝配合!!!