最近项目上一直在用mongodb作为数据库,mongodb有他的优势,文档型类json格式存储数据,修改起来比传统的关系型数据库更方便,但是最近在用mongodb出现了查询缓慢的问题,我用命令行查询,显示速度非常快,而且也添加了索引,2万条数据只需要十几毫秒,但是用代码实现却需要好几秒,我调试了代码发现代码生成的查询语句跟我在命令行的查询语句是一样的,我当时就很纳闷。

我当时的代码是这样写的:

var list = collection.FindAs<AdClick>(query).SetSortOrder(s).toList();

这是很正常的一行代码,根据查询条件,按照排序返回List集合,当我去掉tolist之后,速度就秒查了,然后我看到返回的类型是mongoCursor。这里我要介绍一下MongoCursor,他是mongo的游标,他其实并没有真正的查询到结果,相当于懒加载,

在调用find时,MongoDB shell并不立即查询数据库,而是在等待真正开始获取数据时才发送查询。(类似Linq中IQueryable),你可以通过游标来对最终结果进行控制。比如限制结果数量,略过某一部分,根据任意键按任意顺序的组合对结果进行各种排序等。当时当你调用ToList()的时候,他就会把查询数据全部加载到内存,如果查询的数据多,这个过程那个就会很慢,所以真正慢的原因,就是ToList(),知道了慢的原因修改器起来就很好改了。

但是修改了这个又发现了另外一个问题,那就是Mongodb加查询条件的count()也会很慢,因为做统计需要得到总数,直接不加查询条件直接调用Count()比加了查询条件调用count()快,因为mongodb的查询是根据索引来的,如果你查询条件越多,没有命中查询条件的索引,就会全文搜索,所以就会很慢,所以使用count()函数的时候,尽量不加查询条件,但显然是不现实的,因为查询条件会必然很多。 后来在网上看到一个解决方案就是用MongoCursor.Size()方法,果然速度快了很多,不知道原因,没有仔细研究。

还有一个问题,就是mongo的分页问题,你会发现,开始几页会很快,越到后面,分页越慢,这是mongo会把查询结果加载到内存,由于内存的限制,越到后面越慢,有什么解决方案呢?

db.test.sort({"amount":1}).skip(100000).limit(10)  //183ms
db.test.find({amount:{$gt:2399927}}).sort({"amount":1}).limit(10)  //53ms
  根据查询条件加载分页,只查询10条数据加载到内存,skip分页貌似很影响效率,不要轻易使用Skip来做查询,否则数据量大了就会导致性能急剧下降,这是因为Skip是一条一条的数过来的,多了自然就慢了。

解决mongodb查询慢的问题的更多相关文章

  1. MongoDB查询转对象是出错Element '_id' does not match any field or property of class

    MongoDB查询转对象是出错Element '_id' does not match any field or property of class   解决方法: 1.在实体类加:[BsonIgno ...

  2. mongodb查询速度慢是什么原因?

    mongodb查询速度慢是什么原因? 通过mongodb客户端samus代码研究解决问题         最近有项目需要用到mongodb,于是在网上下载了mongodb的源码,根据示例写了测试代码, ...

  3. mongo 固定集合,大文件存储,简单优化 + 三招解决MongoDB的磁盘IO问题

    1.固定集合 > db.createCollection(, max:});//固定集合 必须 显式创建. 设置capped为true, 集合总大小xxx字节, [集合中json个数max] { ...

  4. MongoDB学习笔记(二、MongoDB查询)

    目录: MongoDB数据类型 MongoDB新增语法 MongoDB查询语法 MongoDB查询选择器 MongoDB关联查询 MongoDB数据类型: MongoDB新增语法: 语法:db.col ...

  5. 使用dynamic linq 解决自定义查询的若干弊端

    在项目中想必大家肯定是使用各种ORM, 如:NH.EF.fluent Data. 然而我在使用ORM的这几年中,随着数据库的结构越来越复杂,自定义查询的越来越多,但是一直没有解决一个问题就是自定义查询 ...

  6. MongoDB查询操作限制返回字段的方法

    这篇文章主要介绍了MongoDB查询操作限制返回字段的方法,需要的朋友可以参考下   映射(projection )声明用来限制所有查询匹配文档的返回字段.projection以文档的形式列举结果集中 ...

  7. mongodb查询文档

    说到查询,我们一般就想起了关系型数据库的查询了,比如:order by(排序).limit(分页).范围查询(大于某个值,小于某个值..,in查询,on查询,like查询等待很多),同样mongodb ...

  8. [转]mongodb 查询条件:关系运算符"$lt", "$lte", "$gt", "$gte", "$ne" 逻辑运算符"$and“, "$or“, "$nor“

    mongodb 查询条件   这节来说说mongodb条件操作符,"$lt", "$lte", "$gt", "$gte" ...

  9. Mongodb查询的用法,备注防止忘记

    最近在用这个东西,为防止忘记,记下来. 集合简单查询方法 mongodb语法:db.collection.find()  //collection就是集合的名称,这个可以自己进行创建. 对比sql语句 ...

随机推荐

  1. 一文了解ConfigurationConditon接口

    ConfigurationCondition 接口说明 @Conditional 和 Condition ​ 在了解ConfigurationCondition 接口之前,先通过一个示例来了解一下@C ...

  2. JSP——Web应用

      1.EL表达式   2.jstl fmt功能说明     3.jsp 自定义标签     4.QR码————二维码等条码

  3. 大数据:Hive常用参数调优

    1.limit限制调整 一般情况下,Limit语句还是需要执行整个查询语句,然后再返回部分结果. 有一个配置属性可以开启,避免这种情况---对数据源进行抽样 hive.limit.optimize.e ...

  4. &lt;二代測序&gt; 下载 NCBI sra 文件

    本文近期更新地址: http://blog.csdn.net/tanzuozhev/article/details/51077222 随着測序技术的不断提高.二代測序数据成指数增长. NCBI提供了S ...

  5. jquery实现重置

    $('#reset').click(function(){ $('#info_frm')[0].reset(); });

  6. 【BZOJ4237】稻草人 cdq分治+单调栈+二分

    [BZOJ4237]稻草人 Description JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田 ...

  7. 关于EF输出sql的执行日志

    sqlserver中可以使用sql profiler:但是mysql当中无法查看:只能借助于组件: ADO.NET Entity Framework CodeFirst 如何输出日志(EF4.3) 用 ...

  8. 九度OJ 1022:游船出租 (统计)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3670 解决:1444 题目描述:     现有公园游船租赁处请你编写一个租船管理系统.当游客租船时,管理员输入船号并按下S键,系统开始计时 ...

  9. ajax实时获取下拉数据

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> ajax ...

  10. 剑指Offer:删除链表的节点【18】

    剑指Offer:删除链表的节点[18] 题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3-& ...