天天看點

MongoDB 自動删除集合中過期的資料——TTL索引

簡介

​ TTL (Time To Live, 有生命周期的) 索引是特殊單字段索引,MongoDB可以用來在一定時間後自動從集合中删除文檔的特殊索引。 這對于某些類型的資料非常好,例如機器生成的事件資料,日志和會話資訊,這些資訊隻需要在資料庫中保留一段時間。

​ 建立 TTL 索引,隻需要在使用 db.collection.createIndex() 方法,對字段值為日期或者包含日期的數組設定 expireAfterSeconds 選項即可。

1、如果字段是一個數組,并有多個日期值時,MongoDB使用最低(即最早)日期值來計算失效門檻值。

2、如果字段不是日期類型也不是一個包含日期的數組類型那麼文檔就永遠不會過期。

3、如果一個文檔不包含索引字段,該文檔也不會到期。

示例

// 建立一個 TTL 索引

db.eventlog.createIndex( { "lastModifiedDate": 1 }, { expireAfterSeconds: 600 } )

// 修改TTL索引的過期時間

db.runCommand( { collMod: "eventlog",

index: { keyPattern: { lastModifiedDate: 1 },
                      expireAfterSeconds: 3600
                    }           

})

删除操作

過期資料的删除工作是由 mongod 背景線程來執行,每60秒進行一次。

對于複制集情況, TTL 背景線程隻會删除主節點上過期的資料,從節點過期文檔删除則依賴主節點(從節點的 TTL 背景線程是停止狀态)。

索引差別

對于查詢而言,TTL 索引和其他索引沒有差別。

TTL索引有哪些限制

單字段索引,複合索引時 expireAfterSeconds 會别忽略掉。

_id 字段不支援減 TTL 索引。

不能在固定集合上建立 TTL 索引,因為固定集合不支援

QQ購買平台

删除操作。

不能使用 createIndex() 去修改一個已存在索引的 expireAfterSeconds 。相反,可以使用collMod 指令來修改。否則,改變現有索引的選項的值,你必須删除索引,重新建立。

如果一個非TTL單字段索引字段已經存在,您不能再建立一個同字段的TTL索引,因為不能建立相同鍵不同選項的多個索引。改變非TTL單字段索引成TTL索引,首先你必須先删除索引再現expireAfterSeconds選項建立索引。