项目中使用到了mongdb,在小数据量时,和关系型数据库一样,看不出任何问题。当数据的操作变的频繁,如对10万级的数据表连续进行查询操作,mongdb会变的非常缓慢。
到底是什么原因呢?
这是spring版本的mongdb操作,spring的MongoTemplate只是对源生方法的一些封装,如果spring环境下有这些问题,直接使用源生方法进行的数据操作也会产生同样的问题。
下面是我的优化过程:
1.建立索引,索引对mongdb的查询速度影响非常大,mongdb索引建立的方法网上有很多,我这里举一个实际的例子:
有个数据表叫Student,该表中name、age属性被用作查询条件,其中name被使用的频率非常大,age在特定的地方会和name同时作为查询条件,age几乎不会单独作为查询条件。
索引建立过程如下:
db.Student.ensureIndex({ "name" : 1, "age" : -1 },{ "name" : "name_age_index" });
如果使用MongoVUE客户端软件的话,直接添加索引输入:{ "name" : 1, "age" : -1 }即可。
最后记得建立索引后不要随便drop表。
2.优化代码,方法使用不当会显著影响mongdb性能,这里我列举一下我的使用经验:
a.单纯的更新数据操作使用 mongoTemplate.updateFirst() 或者mongoTemplate.updateMulti()代替mongoTemplate.findAndModify();
b.单纯的新增数据操作使用 mongoTemplate.insert()代替 mongoTemplate.save();
c.查询1条数据使用 mongoTemplate.findOne()代替 mongoTemplate.find()后遍历数据;
d.查询数据时注意数据量,如果使用mongoTemplate.find()的结果集过大,如10万100万,则数据会积压在内存中,这是非常危险的,尽量使用limit方法限制条数。
3.谨慎选择是否使用mongdb,在我们的项目使用过程中,确确实实的发现一些问题。选择使用Mongodb使要考虑服务器配置,因为Mongodb对内存是无限贪婪的,如果只有2G内存的服务器,还要运行其他服务等,部署Mongodb的话处理小数据量还是可以的,进行大量的数据处理是不适合的。在我看来使用NOSQL就是可以花最少的钱处理更多的数据量,并且对数据的安全性不是非常看重的情况,比如允许数据丢失,或者无法处理事务等情况。如果对数据安全性要求较高的情形下,建议慎重考虑。