zoukankan      html  css  js  c++  java
  • 使用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,更需要了解其他网络、操作系统相关的知识。
    不可以把视线拘泥于代码层面。
    加油!

    【完】
  • 相关阅读:
    spring cloud/spring boot同时支持http和https访问
    解决to the cache because there was insufficient free space available after evict
    国外天气api 国际天气预报今天、未来3天、未来7天的天气预报信息接口
    java 访问get接口请求外部的json数据
    IDEA创建基于Maven的SpringBoot项目-多模块
    PostgreSQL提取每个ID的最后一行(Postgresql extract last row for each id)
    Vue项目引入百度地图
    Vue 引入天地图 & 地图类型切换
    js在新窗口打开链接
    mysql使用小数注意
  • 原文地址:https://www.cnblogs.com/lindsay-chh/p/7090011.html
Copyright © 2011-2022 走看看