1、前言
在之前操作mongo的过程中,都是自动创建,几乎没有手动创建过表。
这次开发中有张表数据量大,并且不是特别重要,数据表维护一个常见的问题是过期数据没有被及时清理,导致数据量过大,查询变得缓慢。为了解决这个问题,我们可以通过创建过期索引来定期清理过期数据。
数据过期的原理可以看下之前的文章:我屮艸芔茻,mongo居然可以自动删除数据
2、直接上代码
逻辑很简单,在服务器启动之后去检查索引
1.先检查存不存在这个索引
2.然后创建索引
3.在每个entity中增加了一个save_time的字段
package com.tyjt.ccpparking.mgr;
import com.tyjt.ccpparking.domain.entity.ParkingHBEntity;
import com.tyjt.ccpparking.domain.entity.ParkingRestInfoEntity;
import com.tyjt.ccpparking.msg.EmqxHBHandler;
import com.tyjt.ccpparking.service.ParkingService;
import lombok.Data;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.index.Index;
import org.springframework.data.mongodb.core.index.IndexDefinition;
import org.springframework.data.mongodb.core.index.IndexInfo;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
@Component
@Data
public class Mgr implements ApplicationRunner {
private static Logger logger = LoggerFactory.getLogger(Mgr.class);
@Resource
MongoTemplate mongoTemplate;
public Mgr() {
mgr = this;
}
private static Mgr mgr;
public static Mgr getInstance() {
return mgr;
}
@Override
public void run(ApplicationArguments args) throws Exception {
createMongoIndex(ParkingHBEntity.class);
createMongoIndex(ParkingRestInfoEntity.class);
}
/**
* 创建mongo的索引
*
* @param clazz
*/
public void createMongoIndex(Class clazz) {
try {
if (isIndexExists(clazz)) {
return;
}
Index index = new Index();
index.on("save_time", Sort.Direction.DESC);
index.expire(7, TimeUnit.DAYS);
mongoTemplate.indexOps(clazz).ensureIndex(index);
} catch (Exception e) {
logger.error("create index fail {}", clazz.getName(), e);
}
}
public boolean isIndexExists(Class clazz) {
List<IndexInfo> indexInfos = mongoTemplate.indexOps(clazz).getIndexInfo();
for (IndexInfo indexInfo : indexInfos) {
if ("save_time_-1".equals(indexInfo.getName())) {
return true;
}
}
return false;
}
}
注:这里可以直接接写collection name,
也可以使用实体的class,因为mongo的entity的注解有@Document(collection = "parking_HB")
注:在删除表的时候也会删除索引
3、总结
在Mongo数据库中创建过期索引,定期清理过期数据以保证数据的质量和性能。
创建过期索引可以大大简化过期数据的清理过程,并且可以帮助我们避免在查询和数据分析时出现问题。
同时,定期清理过期数据可以提高查询和分析的效率,保证系统的性能。
希望本文对您在Mongo数据库管理和维护方面有所帮助。如果您有任何问题或建议,请在下方留言区留言,我将尽快回复