MongoDB(online) 优化

MongoDB(online) 优化

  • 1. find、findOne
  • 2. 操作 vip_emp_relation 的一个公共方法
  • 3. 查询记录数
  • 4. save、insert
  • 5. 总结

1. find、findOne

  • 项目实例
MongoTemplate mongoTemplate = mongodbClient.getMongoTemplate();
DBCollection cursor = mongoTemplate.getCollection("vip_batchsend_message");
BasicDBObject query = new BasicDBObject();
query.put("sms_code", sms_code);
query.put("open_id", open_id);

JSONObject message = new JSONObject();

DBCursor cursor1 = cursor.find(query);
LOGGER.info("-------------sms_code:" + sms_code + "----open_id:" + open_id + "--" + cursor1.size());
if (cursor1.size() > 0) {
    DBObject dBObject = cursor1.next();
    String corp_code = dBObject.get("corp_code").toString();
    .....
  • 简单阐述

    1. 代码意图是如果记录存在就修改
    2. 只需要判断是否存在就完成目的
    3. find返回的是DBCursor,这里不合适,我们只需要知道是否存在即可
    4. 修改建议
      1. 固定的条件提前预先组合
      2. find改成findOne
      3. 判断只需要查询一条记录即可,用findOne就可以,直接获取一个Object,判断后即可根据Key获取Value进行后续操作
  • 建议修改
BasicDBObject query = new BasicDBObject();
query.put("sms_code", sms_code);
query.put("open_id", open_id);
MongoTemplate mongoTemplate = mongodbClient.getMongoTemplate();
JSONObject message = new JSONObject();
DBCollection cursor = mongoTemplate.getCollection("vip_batchsend_message");
DBObject dbObject = cursor.findOne(query);
if (dbObject.isPartialObject()) {
    LOGGER.info("-------------sms_code:" + sms_code + "----open_id:" + open_id + "--" + 1);
    String corp_code = dbObject.get("corp_code").toString();
    String vip_id = dbObject.get("vip_id").toString();
    Data data_corp_code = new Data("corp_code", corp_code, ValueType.PARAM);
    Data data_vip_id = new Data("vip_ids", vip_id, ValueType.PARAM);
    ......

2. 操作 vip_emp_relation 的一个公共方法

  • 项目实例
 public DBCursor selectRelation(String app_user_name, String open_id) throws SQLException {
        MongoTemplate mongoTemplate = mongodbClient.getMongoTemplate();
        DBCollection cursor = mongoTemplate.getCollection(WxConst.table_vip_emp_relation);

        Map keyMap = new HashMap();
        keyMap.put("_id", app_user_name + open_id);
        BasicDBObject queryCondition = new BasicDBObject();
        queryCondition.putAll(keyMap);
        DBCursor dbCursor = cursor.find(queryCondition);
        return dbCursor;
    }
  • 简单阐述

    1. 查看此方法的引用,基本是做判断使用,没必要返回一个Cursor
    2. 如果引用的方法,有长任务,然后再操作,就会等待很长时间不释放资源
  • 建议修改
     public DBObject selectRelation(String app_user_name, String open_id) throws SQLException {
        Map keyMap = new HashMap();
        keyMap.put("_id", app_user_name + open_id);
        BasicDBObject queryCondition = new BasicDBObject();
        queryCondition.putAll(keyMap);
        MongoTemplate mongoTemplate = mongodbClient.getMongoTemplate();
        DBCollection cursor = mongoTemplate.getCollection(WxConst.table_vip_emp_relation);
        DBObject dbCursor = cursor.findOne(queryCondition);
        return dbCursor;
    }

3. 查询记录数

  • 项目实例
BasicDBObject basicDBObject=new BasicDBObject();
basicDBObject.put("activity_code",activity_code);
basicDBObject.put("open_id",open_id);
basicDBObject.put("status","1");
int count=cursor.find(basicDBObject).count();
basicDBObject.put("sign_status","Y");
int sign_count=cursor.find(basicDBObject).count();
if(sign_count>0){
    result="您已签到成功,请勿重复签到";
}else {
    if (count > 0) {
        BasicDBObject query=new BasicDBObject();
        query.put("activity_code",activity_code);
        query.put("open_id",open_id);
    ......
  • 简单阐述

    1. 根据条件获取记录数
    2. 没必要先获取文档游标再查询记录数
  • 建议修改
BasicDBObject basicDBObject=new BasicDBObject(); basicDBObject.put("activity_code",activity_code);
basicDBObject.put("open_id",open_id);
basicDBObject.put("status","1");
Long count=cursor.count(basicDBObject);
basicDBObject.put("sign_status","Y");
Long sign_count=cursor.count(basicDBObject);
if(sign_count>0){
    result="您已签到成功,请勿重复签到";
}else {
    if (count > 0) {
        BasicDBObject query=new BasicDBObject();
        query.put("activity_code",activity_code);
        query.put("open_id",open_id);
    ......

4. save、insert

  • 项目实例
if (cursor.find(basicDBObject).count() > 0){
    BasicDBObject basicDBObject1=new BasicDBObject();
    basicDBObject1.put("sign_status","Y");
    basicDBObject1.put("sign_date",Common.DATETIME_FORMAT.format(new Date()));
    BasicDBObject update=new BasicDBObject();
    update.put("$set",basicDBObject1);
    cursor.update(basicDBObj,update,true,false);
}else {
    BasicDBObject dbObject = new BasicDBObject();
    dbObject.put("_id", app_id + "_" + activity_code  + "_" + open_id);
    dbObject.put("corp_code", corp_code);
    dbObject.put("sign_status","Y");
    dbObject.put("sign_date",Common.DATETIME_FORMAT.format(new Date()));
    dbObject.put("app_id", app_id);
    dbObject.put("activity_code", activity_code);
    dbObject.put("status", "0");
    dbObject.put("open_id", open_id);
    dbObject.put("vip", vip_array.getJSONObject(0));
    dbObject.put("modified_date", Common.DATETIME_FORMAT.format(new Date()));
    dbObject.put("created_date", Common.DATETIME_FORMAT.format(new Date()));
    cursor.save(dbObject);
}
    ......
  • 简单阐述

    1. save 是先根据_id查询再修改,如果已经确认记录不存在可以省去查找的功能直接insert
  • 建议修改
if (cursor.find(basicDBObject).count() > 0){
    BasicDBObject basicDBObject1=new BasicDBObject();
    basicDBObject1.put("sign_status","Y");
    basicDBObject1.put("sign_date",Common.DATETIME_FORMAT.format(new Date()));
    BasicDBObject update=new BasicDBObject();
    update.put("$set",basicDBObject1);
    cursor.update(basicDBObj,update,true,false);
}else {
    BasicDBObject dbObject = new BasicDBObject();
    dbObject.put("_id", app_id + "_" + activity_code  + "_" + open_id);
    dbObject.put("corp_code", corp_code);
    dbObject.put("sign_status","Y");
    dbObject.put("sign_date",Common.DATETIME_FORMAT.format(new Date()));
    dbObject.put("app_id", app_id);
    dbObject.put("activity_code", activity_code);
    dbObject.put("status", "0");
    dbObject.put("open_id", open_id);
    dbObject.put("vip", vip_array.getJSONObject(0));
    dbObject.put("modified_date", Common.DATETIME_FORMAT.format(new Date()));
    dbObject.put("created_date", Common.DATETIME_FORMAT.format(new Date()));
    cursor.insert(dbObject);
}
    ......

5. 总结

  1. 以上是目前发现的问题及建议,会继续Review
  2. 涉及到IO的操作标配就是尽晚打开尽早释放
  3. 阿里的MongoDB默认没有启动读写分离(我已经测试确认过),我测试后会加上
  4. 业务实现过程,尽可能结构化数据,介绍拼接出错或Key不存在的异常
  5. 涉及到Cursor尽快手动关闭
  6. 其它项目也可以参考,或者抛出来

原文地址:https://www.cnblogs.com/lzh-boy/p/9037053.html

时间: 2024-10-10 04:52:49

MongoDB(online) 优化的相关文章

MongoDB性能优化五个简单步骤

大家在使用MongoDB的时候有没有碰到过性能问题呢?这里总结了MongoDB性能优化的五个步骤,希望能够有所帮助. 第一步:找出慢语句 一般来说查询语句太慢和性能问题瓶颈有着直接的关系,所以可以用MongoDB的性能分析工具来找出这些慢语句: db.setProfilingLevel(1, 100); 第二步:使用explain分析 通过使用explain来对这些慢语句进行诊断.此外还可以mtools来分析日志. 第三步:创建索引 分析完之后需要创建新的索引(index)来提升查询的性能.别忘

java MongoDB分页优化

最近项目在做网站用户数据新访客统计,数据存储在MongoDB中,统计的数据其实也并不是很大,1000W上下,但是公司只配给我4G内存的电脑,让我程序跑起来气喘吁吁...很是疲惫不堪. 最常见的问题莫过于查询MongoDB内存溢出,没办法只能分页查询.这种思想大家可能都会想到,但是如何分页,确实多有门道! 网上用的最多的,也是最常见的分页采用的是skip+limit这种组合方式,这种方式对付小数据倒也可以,但是对付上几百上千万的大数据,却只能望而兴叹... 经过网上各种查找资料,寻师问道的,发现了

MongoDB性能优化

MongoDB是一个高性能可扩展基于文档的NoSQL数据库,高性能也需要在多个关键维度的配置,包括硬件.应用模式.模式设计.索引.磁盘I/O等. 存储引擎 WiredTiger是3.0以后的默认存储引擎,细粒度的并发控制和数据压缩提供了更高的性能和存储效率.3.0以前默认的MMAPv1也提高了性能.在MongoDB复制集中可以组合多钟存储引擎,各个实例实现不同的应用需求. 硬件 MongoDB初衷是采用水平扩展构建集群,而不是价格更高的硬件升级.采用复制保证高可用,自动分片使数据均匀分布在各节点

MongoDB性能优化指南

一.索引 MongoDB 提供了多样性的索引支持,索引信息被保存在system.indexes 中,且默认总是为_id创建索引,它的索引使用基本和MySQL 等关系型数据库一样.其实可以这样说说,索引是凌驾于数据存储系统之上的另一层系统,所以各种结构迥异的存储都有相同或相似的索引实现及使用接口并不足为 奇. 1.基础索引 在字段age 上创建索引,1(升序);-1(降序): db.users.ensureIndex({age:1}) _id 是创建表的时候自动创建的索引,此索引是不能够删除的.当

【MongoDB】MongoDB之优化器Profiler

在mysql数据库中,慢查询日志经常作为优化数据库的依据, mongodb中依然有类似的功能.Mongodb自带的profiler,可以方便地记录所有耗时的操作,以便于调优: 一.开始profiler功能 开启profier功能有两种: 第一种就是直接在启动参数里面进行设置,就在茄冬mongodb时候添加-profile=级别 第二种就是在客户端执行"db.setProfilingLevel(级别)"命令 profiler信息保存在system.profile表中,可以通过执行&quo

开发高性能的MongoDB应用—浅谈MongoDB性能优化(转)

出处:http://www.cnblogs.com/mokafamily/p/4102829.html 性能与用户量 “如何能让软件拥有更高的性能?”,我想这是一个大部分开发者都思考过的问题.性能往往决定了一个软件的质量,如果你开发的是一个互联网产品,那么你的产品性能将更加受到考验,因为你面对的是广大的互联网用户,他们可不是那么有耐心的.严重点说,页面的加载速度每增加一秒也许都会使你失去一部分用户,也就是说,加载速度和用户量是成反比的.那么用户能够接受的加载速度到底是多少呢? 如图,如果页面加载

【转】mongodb可以通过profile来监控数据 (mongodb性能优化)

开启 Profiling  功能 ,对慢查询进行优化: mongodb可以通过profile来监控数据,进行优化. 查看当前是否开启profile功能用命令 db.getProfilingLevel()  返回level等级,值为0|1|2,分别代表意思:0代表关闭,1代表记录慢命令,2代表全部 db.setProfilingLevel(level);  #level等级,值同上 level为1的时候,慢命令默认值为100ms,更改为db.setProfilingLevel(level,slow

mongodb分页优化

mongodb分页很简单,本文主要讲分页可能遇到的问题,以及优化方案 从传统web到移动端api,我们都面临一样的问题,比如ajax get有大小显示等,都会强迫你不得不分页 比如我的项目使用ratchet做h5框架,它的push.js里就是ajax get加载其他页面,页面太大就会报错. 分页说明 以典型的列表api来说:下拉刷新是获取最新信息,然后上拉加载下一页 常见api要写的2个接口 get_latest(model,count) get_with_page(number,size) g

开发高性能的MongoDB应用—浅谈MongoDB性能优化

关联文章索引: 大数据时代的数据存储,非关系型数据库MongoDB(一) 性能与用户量 “如何能让软件拥有更高的性能?”,我想这是一个大部分开发者都思考过的问题.性能往往决定了一个软件的质量,如果你开发的是一个互联网产品,那么你的产品性能将更加受到考验,因为你面对的是广大的互联网用户,他们可不是那么有耐心的.严重点说,页面的加载速度每增加一秒也许都会使你失去一部分用户,也就是说,加载速度和用户量是成反比的.那么用户能够接受的加载速度到底是多少呢? 如图,如果页面加载时间超过10s那么用户就会离开

mongodb redis 优化 (centos 7)

mongodb (WARNING: soft rlimits too low) 修改配置文件 /etc/security/limits.conf,添加配置信息: [[email protected] ~]# vi /etc/security/limits.conf mongod soft nofile 64000 mongod hard nofile 64000 mongod soft nproc 32000 mongod hard nproc 32000 mongodb & redis 禁用大