MongoDB在这里比PostgreSQL慢了7倍

编程应用、实战教程,不容错过

最近有需求,要将一个局域网Web数据平台迁移到线上,顺带着,本地服务使用的PostgreSQL也要替换成国内某云的MongoDB。

由于之前的Web框架选择的Django,为了能够最小限度地改动代码,并对接上MongoDB上已存在的数据库和数据,在一番对比之后(Djongo和MongoEngine),选择了MongoEngine这个对象文档映射(ODM)模块来替代Django原有的ORM。

对照着MongoEngine的文档一顿操作,第一个页面迁移完成,赶紧打开看看。

不看则已,一看瞎哭,页面加载完足足等了1、2、3、4、5、6、7、8、……27秒

(线上MongoDB服务)

而之前的系统这个页面打开只需要几秒钟:

(本地PostgreSQL服务)

这还了得,上线了不是给自己丢脸吗,赶紧排查测试。

在这个页面里面,主要数据操作是从数据库中查询出原始数据,然后加载到Pandas的DataFrame中,接着在Pandas中进行各种数据处理,最后返回JSON数据给前端进行渲染。

数据库总的数据量为接近500万,最后的查询结果在3万左右。

对各个环节分别进行测试发现,主要的时间消耗在了从数据库读取数据,然后加载到Pandas这个过程中。

于是将这个过程专门提取出来,单独测试其消耗的时间。结果发现,使用MongoEngine进行数据查询,然后加载到Pandas中需要几十秒的时间:

21秒的耗时,可能是由于MongoEngine对PyMongo进行封装之后的性能不行吧,于是直接使用PyMongo进行测试:

果然,经过一层封装之后,MongoEngine的效率不如PyMongo,但是直接使用PyMongo也消耗了14秒的时间。

而在本地使用PostgreSQL作为数据库后端的Django ORM测试仅仅花费了3秒的时间:

使用list()对数据查询结果进行处理是将其加载到Pandas中的一个常规前置操作,相当于遍历查询集的结果并将每一条数据添加到一个列表中。类似于以下操作:

res = []
for i in xx:
   res.append(i) 

只是一个list()操作,就让MongoDB的速度比PostgreSQL慢如此之多,难道我哪里操作不对?

欢迎小伙伴们出谋划策,分享解决方案~

万水千山总是情,点个“收藏”行不行

原文发布于微信公众号 - 州的先生(zmister2016)

原文发表时间:2019-09-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券