MongoDB TTL索引的使用
<p></p><div class="toc"><div class="toc-container-header">目录</div><ul><li>一、TTL索引介绍</li><li>二、TTL索引运行逻辑</li><li>三、TTL索引的限制</li><li>四、TTL索引的使用场景<ul><li>1. 指定具体的过期时间属性</li><li>2. 插入一个具体的过期时间</li><li>3. TTL属性的修改(collMod)</li></ul></li><li>五、Date类型</li><li>六、参考文档</li></ul></div><p></p><h2 id="一ttl索引介绍">一、TTL索引介绍</h2>
<blockquote>
<p>TTL全称是(Time To Live),TTL索引能对一个单列配置过期属性来<code>实现对文档的自动过期删除</code>,我们可以在对字段创建索引时添加<code>expireAfterSeconds</code>选项将索引转换为TTL索引,该<code>字段需要是date类型</code>,在以下几种场景下即使索引设置了expireAfterSeconds属性也不会生效<br>
- 如果该字段不是date类型,则文档不会过期<br>
- 如果文档没包含索引的这个字段,则文档不会过期</p>
</blockquote>
<h2 id="二ttl索引运行逻辑">二、TTL索引运行逻辑</h2>
<blockquote>
<ul>
<li>MongoDB会开启一个后台线程读取该TTL索引的值来判断文档是否过期,但不会保证已过期的数据会立马被删除,因后台线程<code>每60秒触发一次删除任务</code>,且如果删除的数据量较大,会存在上一次的删除未完成,而下一次的任务已经开启的情况,导致过期的数据也会出现超过了数据保留时间60秒以上的现象。</li>
<li>对于副本集而言,<code>TTL索引的后台进程只会在primary节点开启</code>,在从节点会始终处于空闲状态,从节点的数据删除是由主库删除后产生的oplog来做同步。</li>
<li>TTL索引除了有expireAfterSeconds属性外,<code>和普通索引一样</code>。</li>
</ul>
</blockquote>
<h2 id="三ttl索引的限制">三、TTL索引的限制</h2>
<ul>
<li>只支持对<code>单个字段创建TTL索引</code>,复合索引不支持expireAfterSeconds选项</li>
<li><code>_id列不支持</code>TTL索引</li>
<li><code>固定集合(capped collection)不支持</code>TTL索引</li>
<li>不支持用createIndex() 修改expireAfterSeconds属性,但可以<code>用collMod命令修改</code>,或者重建索引,但重建对于大集合成本较高,建议用collMod方式</li>
<li>一个列只能创建普通索引或TTL索引,<code>不能同时对一个列创建这2种类型索引</code>(实际TTL索引本身就是普通索引,只是多了一个过期属性)</li>
<li>如果一个<code>列已经存在索引,则需要先将该索引drop后才能重建为TTL索引</code>,不能直接转换</li>
</ul>
<h2 id="四ttl索引的使用场景">四、TTL索引的使用场景</h2>
<h3 id="1-指定具体的过期时间属性">1. 指定具体的过期时间属性</h3>
<blockquote>
<p>该场景是在创建索引时明确指定一个expireAfterSeconds时间作为文档的过期时间</p>
</blockquote>
<pre><code class="language-javascript">// 对log_events集合的createdAt字段创建TTL索引且设置expireAfterSeconds过期时间为3600秒(1小时)
onepiece:PRIMARY> db.log_events.createIndex( { "createdAt": 1 }, { expireAfterSeconds: 3600 } )
// 对文档插入数据,包含createdAt字段,则该文档会在1小时候字段删除
onepiece:PRIMARY> db.log_events.insert( {
"createdAt": new Date(),
"logEvent": 2,
"logMessage": "Success!"
} )
</code></pre>
<h3 id="2-插入一个具体的过期时间">2. 插入一个具体的过期时间</h3>
<blockquote>
<p>该场景是在创建索引时将expireAfterSeconds设置为0,在这种情况下由插入到字段的数据来控制文档何时过期,这种场景更加精细化,可灵活的控制文档的过期时间及控制在业务低峰期触发文档过期</p>
</blockquote>
<pre><code class="language-javascript">// 对log_events集合的expireAt创建TTL索引,并设置expireAfterSeconds属性为0
onepiece:PRIMARY> db.log_events.createIndex( { "expireAt": 1 }, { expireAfterSeconds: 0 } )
// 对文档插入数据,包含expireAt字段,该文档过期时间就是expireAt字段记录的时间
onepiece:PRIMARY> db.log_events.insert( {
"expireAt": new Date('Jan 16, 2020 14:00:00'),
"logEvent": 2,
"logMessage": "Success!"
} )
</code></pre>
<h3 id="3-ttl属性的修改collmod">3. TTL属性的修改(collMod)</h3>
<blockquote>
<p>对于TTL索引的expireAfterSeconds的属性,可以用collMod方式进行修改</p>
</blockquote>
<pre><code class="language-javascript">// 创建TTL索引设置1小时过期属性
onepiece:PRIMARY> db.log_events.createIndex( { "createdAt": 1 }, { expireAfterSeconds: 3600 } )
{
"createdCollectionAutomatically" : true,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
// 查看索引定义
onepiece:PRIMARY> db.log_events.getIndexes()
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "test.log_events"
},
{
"v" : 2,
"key" : {
"createdAt" : 1
},
"name" : "createdAt_1",
"ns" : "test.log_events",
"expireAfterSeconds" : 3600
}
]
// 修改索引定义,将一小时文档过期改为60秒
onepiece:PRIMARY> db.runCommand( { collMod: "log_events",
index: { keyPattern: { createdAt: 1 },
expireAfterSeconds: 60
}
})
// 返回值: { "expireAfterSeconds_old" : 3600, "expireAfterSeconds_new" : 60, "ok" : 1 }
</code></pre>
<h2 id="五date类型">五、Date类型</h2>
<ul>
<li><code>Date()</code> method which returns the current date as a string.</li>
<li><code>new Date()</code> constructor which returns a Date object using the ISODate() wrapper.</li>
<li><code>ISODate()</code> constructor which returns a Date object using the ISODate() wrapper.</li>
</ul>
<pre><code class="language-javascript">onepiece:PRIMARY> Date()
Thu Jan 16 2020 14:48:40 GMT+0800 (CST)
onepiece:PRIMARY> new Date()
ISODate("2020-01-16T06:48:48.655Z")
onepiece:PRIMARY> ISODate()
ISODate("2020-01-16T06:48:53.673Z")
</code></pre>
<h2 id="六参考文档">六、参考文档</h2>
<ul>
<li>https://docs.mongodb.com/manual/core/index-ttl/index.html</li>
</ul>
</div>
<div id="MySignature" role="contentinfo">
转载请说明出处
|QQ:327488733@qq.com<br><br>
来源:https://www.cnblogs.com/zhenxing/p/12509492.html
頁:
[1]