一、前言:
mongodb部署在阿里云服务器,
mongodb中collection存储了百万条记录。
需求:优化查询指定时间段内的全部数据的查询时间,结果有百万级别。
最初:313587条记录耗时:114.156 s
二、通常解决方式
百度 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)获得所有记录的调用方式是没有任何问题的。
三、针对我问题的解决方式
通常来讲,你们开发环境数据库所在服务器与本身电脑所在服务器在同一个网段;生产环境也是如此。
而个人数据库服务器部署在阿里云,在本身机器上访问互联网中一台机器上的数据库,并加载百万级数据时,
网络延迟会很慢,致使耗时比较长。
因而测试了下将代码放到mongodb所在服务器上执行,一样313587条记录耗时0.84s
完美解决了问题。
四、遗留的小尾巴
将代码放在和数据库同一网段的服务器上执行,会优化百万级别的查询时间。
可是:若是查询记录数太大,而服务器内存不够,服务器会out of memory,正在执行的程序会被系统kill掉。
因此:要么加大服务器内存,要么再来一台和服务器同一网段的服务器,作到单机单用。
五、总结 程序员不只要学会使用API,更须要了解其余网络、操做系统相关的知识。 不能够把视线拘泥于代码层面。 加油!【完】