簡介
? 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 索引,因為固定集合不支持刪除操作。
- 不能使用 createIndex() 去修改一個已存在索引的 expireAfterSeconds 。相反,可以使用collMod 命令來修改。否則,改變現有索引的選項的值,你必須刪除索引,重新創建。
- 如果一個非TTL單字段索引字段已經存在,您不能再創建一個同字段的TTL索引,因為不能創建相同鍵不同選項的多個索引。改變非TTL單字段索引成TTL索引,首先你必須先刪除索引再現expireAfterSeconds選項創建索引。
官網文檔:
https://docs.mongodb.com/manual/core/index-ttl/index.html
作者:學習園
來自個人博客: https://xuexiyuan.cn/article/detail/225.html