概述
mongoDB非关系性数据库,MongoDB是一个高性能,开源,无模式的文档型数据库,一般适用于机器运算和大数据的处理计算中。
优点
查询语言非常强大,类似于面对对象的查询语言,是非关系型数据库中最接近关系型数据库。
实用性
适合大量的或者无固定格式的数据存储。比如:日志、缓存。
spring boot 搭建环境
1、maven 包的引入
pom 中添加 spring-boot-starter-data-mongodb
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
2、配置文件,MongoDB连接
application.properties 中添加配置文件
端口号 27017
数据库 test
spring.data.mongodb.uri=mongodb://name:pass@localhost:27017/test
yaml配置文件
mongodb:
primary:
host: 192.168.9.60
port: 20000
database: test
3、MongoTemplate 数据库连接
MongoTemplate 是数据库与代码连接的接口,对数据库的操作函数和方法。线程安全。
- 增加
MongoTemplate.save(T objectToSave)
public void saveUser(UserEntity userEntity) {
mongoTemplate.save(userEntity);
}
- 删除
MongoTemplate.remove(T objectTodelete)
public void deleteUserById(Long id) {
Query query = new Query(Criteria.where("id").is(id));
mongoTemplate.remove(query);
}
- 修改
只更新一条数据
MongoTemplate.updateFirst(Query query, Update update, Class<?> entityClass)
更新多条数据
MongoTemplate.updateMulti(Query query, Update update, Class<?> entityClass)
query查询的数据
Query(CriteriaDefinition/查询项).is(Object/查询值)
update更新数据
Update(key, value)
public void updateUser(UserEntity userEntity) {
Query query = new Query(Criteria.where("id").is(userEntity.getId()));
Update update = new Update().set("userName", userEntity.getUserName());
mongoTemplate.updateFirst(query, update, UserEntity.class);
}
性能调优
范式化:是将数据分散到多个不同的集合,不同集合之间可以相互引用数据。
修改很快,查询复杂。
反范式化:将每个文档所需的数据都嵌入在文档内部。
每个文档都拥有自己的数据副本,而不是所有文档共同引用同一个数据副本。
查询很快,修改复杂
实际工作中需要根据的需要进行设计表字段。获得更高的效率。
- 填充因子:MongoDB中为翁当的扩展而预留的增长空间。频繁插入,mongDB文档体积会变大,利于插入操作。
1、顺序表中某个元素的大小进行增长的时候,就会导致原来分配的空间不足,只能要求其向后移动。
2、当修改元素移动后,后续插入的文档都会提供一定的填充因子,以便于文档频繁的修改,如果没有不再有文档因增大而移动的话,后续插入的文档的填充因子会依此减小。
3、当文档频繁扩展时,设置 userPowerOf2Sizes 为true。系统会将后续插入的文档,初始空间都分配为2的N次方。 - 索引越少越好:建立一个索引时,系统会为你添加一个索引表,用于索引指定的列,然而当你对已建立索引的列进行插入或修改时,数据库则需要对原来的索引表进行重新排序,重新排序的过程非常消耗性能。
//建立复合索引
db.test.ensureIndex({"age": 1,"no": 1,"name": 1 })
db.test.find().sort("age": 1,"no": 1)
db.test.find().sort("age": 1)