使用pymongo.find查询很慢的解决方式

本文介绍了在阿里云服务器上部署MongoDB并优化查询性能的方法。通过对比不同环境下查询百万级别数据的时间,指出网络延迟是主要瓶颈,并提出了解决方案。
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,更需要了解其他网络、操作系统相关的知识。
不可以把视线拘泥于代码层面。
加油!

【完】

转载于:https://www.cnblogs.com/lindsay-chh/p/7090011.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值