mongodb的TTL索引介紹(超時索引)


TTL索引是mongodb新支持的用於延時自動刪除記錄的一種索引。它僅包含一個字段,該字段值需要是Date()類型,並且不支持復合索引。可以指定某條記錄在延時固定時間后自動刪除。數據自動超時刪除主要用在系統生成的事件、日志或者會話信息等不需要永久存儲的數據。

  • 創建語法


在集合eventlog的字段"lastModifiedDate"上創建延時1小時自動刪除的TTL索引,其中"expireAfterSeconds"是超時字段,單位是秒。

  • 數據超時

TTL索引會按設置的超時時間,自動定期把符合條件的文檔刪除,這里的符合是指索引字段的時間值超時:
1. 該字段如果是一個數組,並且有多個有效的時間值,那么mongodb會按最早的時間值來計算是否超時。
2. 如果某文檔的該字段值不是Date類型或者數組中無有效時間值,那么該文檔不會過期。
3. 如果一個文檔沒有索引字段,那么它也不會過期。

  • 刪除操作

mongodb后台啟動了一個線程來定期查詢並刪除符合條件的文檔。
當TTL線程在執行的時候,你可以通過db.currentOp() 查詢執行狀態。

  • 刪除操作的執行時間

如果以后台的方式創建了TTL索引,系統可以邊創建索引邊執行刪除操作。如果是前台創建方式,則需要在創建完成后開始執行刪除操作。
后台線程會每個1分鍾執行一次刪除操作,因此TTL索引並不能保證文檔在過期的時間點就能被刪除,從文檔過期到被刪除可能會有一段間隔時間,這個間隔包含了線程執行的間隔和執行時刪除文檔的時間。

  • 復制組

在復制組的成員中,只有主節點的后台線程會刪除文檔,其他從節點會同步這個刪除操作。

  • 是否支持查詢

支持查詢時使用TTL索引,同普通的索引一樣。

  • 注意事項

1. TTL索引僅支持一個字段,不能支持復合索引。
2. _id字段不支持TTL索引。
3. 不能再固定大小的集合上創建TTL索引。
4. 不能通過createIndex()接口來改變expireAfterSeconds的值,可以通過"collMod"命令,或者先刪除再創建的方式。
5. 不能在已經建立索引的字段創建TTL索引。

  • 示例

1. 創建索引

mongos> db.eventlog.createIndex( { "lastModifiedDate": 1 }, { expireAfterSeconds: 60 } )
{
"ok" : 1
}

2. 插入4條記錄
mongos> db.eventlog.insert({"title":"mongodb 1","lastModifiedDate":new Date()})
WriteResult({ "nInserted" : 1 })
mongos> db.eventlog.insert({"title":"mongodb 2","lastModifiedDate":new Date()})
WriteResult({ "nInserted" : 1 })
mongos> db.eventlog.insert({"title":"mongodb 3","lastModifiedDate":new Date()})
WriteResult({ "nInserted" : 1 })
mongos> db.eventlog.insert({"title":"mongodb 4","lastModifiedDate":new Date()})

3. 查詢記錄

mongos> db.eventlog.find()
{ "_id" : ObjectId("5a9697a671d2645a6fa3f9cb"), "title" : "mongodb 1", "lastModifiedDate" : ISODate("2018-02-28T11:51:02.804Z") }
{ "_id" : ObjectId("5a9697aa71d2645a6fa3f9cc"), "title" : "mongodb 2", "lastModifiedDate" : ISODate("2018-02-28T11:51:06.393Z") }
{ "_id" : ObjectId("5a9697ad71d2645a6fa3f9cd"), "title" : "mongodb 3", "lastModifiedDate" : ISODate("2018-02-28T11:51:09.416Z") }
{ "_id" : ObjectId("5a9697c671d2645a6fa3f9ce"), "title" : "mongodb 4", "lastModifiedDate" : ISODate("2018-02-28T11:51:34.499Z") }

大概過了90s,再查詢
mongos> db.eventlog.find()
mongos>

果然同時消失了,說明執行超時刪除不是實時的,而是60秒執行一次。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM