使用pymongo.find查询很慢的解决方式
1、前言:
mongodb部署在阿里云服务器,
mongodb中collection存储了百万条记录。
需求:优化查询指定时间段内的所有数据的查询时间,结果有百万级别。
最初:313587条记录耗时:114.156 s
2、一般解决方式
百度 google后,大部分解决方式是创建复合索引,连接如下:
解决:创建复合索引。http://virusswb.blog.51cto.com/115214/816136 但是复合索引并没有解决我的问题,耗时并没有减少。
于是开始以下分析:
其实通过find()查询得到cursor的速度非常快。
耗时发生在cursor的next()迭代过程中:
大部分next()很快,部分next()耗时0.00099s甚至2.9840s。
cursor.next()部分速度慢的原因:
当数据为空后,进入cursor._refresh() 就会变慢。
cursor._refresh()部分速度慢的原因:
-
分析完后,发现cursor._refresh 应该会按照某种算法加载剩余部分数据或全部数据。
其实从mongodb加载数据的过程是免不了的。
所以最初的find()查询得到cursor,
迭代cursor.next()或list(cursor)得到全部记录的调用方式是没有任何问题的。 3、针对我问题的解决方式
一般来说,大家开发环境数据库所在服务器与自己电脑所在服务器在同一个网段;生产环境也是如此。
而我的数据库服务器部署在阿里云,在自己机器上访问互联网中一台机器上的数据库,并加载百万级数据时,
网络延迟会很慢,导致耗时比较长。 于是测试了下将代码放到mongodb所在服务器上执行,同样313587条记录耗时0.84s
完美解决了问题。
4、遗留的小尾巴
将代码放在和数据库同一网段的服务器上执行,会优化百万级别的查询时间。
但是:如果查询记录数太大,而服务器内存不够,服务器会out of memory,正在执行的程序会被系统kill掉。
所以:要么加大服务器内存,要么再来一台和服务器同一网段的服务器,做到单机单用。
5、总结
程序员不仅要学会使用API,更需要了解其他网络、操作系统相关的知识。
不可以把视线拘泥于代码层面。
加油! 【完】
使用pymongo.find查询很慢的解决方式的更多相关文章
- SDE ST_Geometry SQL st_intersects查询很慢的解决方法
环境:服务端 SDE 10.0 oracle 11.2,客户端 PLSQL 11,oracle 11.2 为了调试方便,以下测试都是把sql提取出来在PLSQL上做 需求是已知一个多边形的点坐标,要在 ...
- Microsoft Dynamics CRM 2011 当您在 大型数据集上执行 RetrieveMultiple 查询很慢的解决方法
症状 当您在 Microsoft Dynamics CRM 2011 年大型数据集上执行 RetrieveMultiple 查询时,您会比较慢. 原因 发生此问题是因为大型数据集缓存 Retrieve ...
- win10 右键菜单很慢的解决方式
本来想用 win7 的,不想花很多时间折腾了.现在新电脑主板硬盘CPU都在排挤 win7 ,真是可怜呀.正题: 新电脑的性能应该还算不错的, 18 年跑分 29w 以上,但在图标上面右键却都要转圈几秒 ...
- jboss final 7.1.1相关error以及解决方式
问题1 报错提示: MSC00001: Failed to start service jboss.web.deployment.default-host./: Caused by: java.lan ...
- 1125MySQL Sending data导致查询很慢的问题详细分析
-- 问题1 tablename使用主键索引反而比idx_ref_id慢的原因EXPLAIN SELECT SQL_NO_CACHE COUNT(id) FROM dbname.tbname FORC ...
- MySQL查询优化:查询慢原因和解决技巧
在开发的朋友特别是和mysql有接触的朋友会碰到有时mysql查询很慢,当然我指的是大数据量百万千万级了,不是几十条了,下面我们来看看解决查询慢的办法. MySQL查询优化:查询慢原因和解决方法 会经 ...
- 实战:MySQL Sending data导致查询很慢的问题详细分析(转)
这两天帮忙定位一个MySQL查询很慢的问题,定位过程综合各种方法.理论.工具,很有代表性,分享给大家作为新年礼物:) [问题现象] 使用sphinx支持倒排索引,但sphinx从mysql查询源数据的 ...
- 实战:MySQL Sending data导致查询很慢的问题详细分析(转)
出处:http://blog.csdn.net/yunhua_lee/article/details/8573621 这两天帮忙定位一个MySQL查询很慢的问题,定位过程综合各种方法.理论.工具,很有 ...
- MySQL Sending data导致查询很慢的问题详细分析
这两天帮忙定位一个MySQL查询很慢的问题,定位过程综合各种方法.理论.工具,很有代表性,分享给大家作为新年礼物:) [问题现象] 使用sphinx支持倒排索引,但sphinx从mysql查询源数据的 ...
随机推荐
- MySQL性能优化神器Explain
本文涉及:MySQL性能优化神器Explain的使用 简介 虽然使用Explain不能够马上调优我们的SQL,它也不能给予我们一些调整建议,但是它能够让我们了解MySQL 优化器是如何执行SQL 语句 ...
- C#自动内存分配
一.在程序运行时由CLR管理内存分配(Memory Allocation),程序启动时,操作系统会为每一个线程申请一个独立的栈内存,用于存储方法的局部变量.参数和返回值等:CLR会为进程申请一个连续的 ...
- 例题 5-1 STL
Raju and Meena love to play with Marbles. They have got a lot of marbles with numbers written on the ...
- IDEA 激活方式
最新的IDEA激活方式 使用网上传统的那种输入网址的方式激活不了,使用http://idea.lanyus.com/这个网站提供的工具进行 1.进入hosts文件中:C:\Windows\System ...
- 清除WebSphere部署应用所对应的JSP缓存
Web应用部署在WebSphere Application Server v8.5后程序一般放置在<AppServer>/profiles/<profile_name>/ins ...
- pyinstaller遇到的坑
最近接了一个python的活,具体的就不展开,大概就是需要搭建一个服务器,接收客户端上传文件,调用算法模型,然后返回相应的数据.算法模块用的是tensorflow模块,里面一大堆东西,网上看了很多,最 ...
- Linux 学习(四)
搭建jdk 安装jdk操作: 1.光驱挂载:mount /dev/cdrom /mnt 2.拷贝安装包至其他文件夹(如home目录下) 3.执行安装包(bin包:./包名) 4.配置环境变量:打开文件 ...
- 解决:未能加载文件或程序集“System.Web.Http, Version=5.2.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)
今天发布web API,调用接口报错了:未能加载文件或程序集“System.Web.Http, Version=5.2.4.0, Culture=neutral, PublicKeyToken=31b ...
- 执行join_paired_ends.py报错Cannot find fastq-join
通过 conda 安装 qiime 1后,在执行join_paired_ends.py时报错: burrito.util.ApplicationNotFoundError: Cannot find f ...
- 梦想CAD控件关于标注的系统变量说明
主要用到函数说明: IMxDrawDimension::SetDimVarDouble 设置标注属性的实数类型变量值,详细说明如下: 参数 说明 [in] LONG iType 该属性的类形值 dVa ...