PHP查询MongoDB慢的问题

问题背景:

公司和腾迅合作开发了一款手游,需要开发一个后台管理平台来统计每日游戏数据;数据量相对比较大的集合有两个,一个是user_info,大约有2453条数据,另外一个是room_data,大约有8456条数据。

问题内容:

功能开发完毕,可是查询mongodb数据库并显示数据特别慢,用时大约10S。这是什么鬼,为何如此之慢?

问题解决办法:

首先想到的是给集合添加索引,将所操作集合添加完索引后依旧没有解决问题!汗!什么原因?还是先去问问度娘吧!问了一痛问题还是没有解决。既然度娘解决不了,还是冷静冷静自己查查代码吧。因为统计的数据比较多,所以需要多次的查询数据库,写12个方法为其服务。查询的数据需要进行去重处理,因为第一次使用mongodb数据库,所以还不是很熟,所以去重处理当时是使用PHP做的处理。正是这个去重处理要了我的亲命。先保留第一个方法,将其他所有调用的方法注释掉后发现查询时间并没有什么异常。当打开调用第二个方法的注释后发现查询时间明显的慢了下来。接下来试着修改第二个方法的去重处理交给mongodb去做,惊奇的发现时间快了好多,原来问题出在这;迅速将所有方法的去重处理都改为由mongodb去做,再次测试发现耗时为338ms,大大的节约了时间开销。

问题启示:

问题解决后得到的启示是数据库是为处理存储数据而生,因此数据库能做到的尽量让数据库去做。当然也有特例,比较mysql的多表查询还是少用,效率比较低下。

时间: 2024-10-30 20:56:20

PHP查询MongoDB慢的问题的相关文章

关于php查询mongodb限制返回字段的问题

最近想做一个前端控制接口字段返回的一个基础方法,通过mongodb 的find($query,$field)查询来规定查询的字段,但是遇到这么一个问题: 工作代码中有两个封装方法 : /** * 查询一条记录 * @param string 集合名 * @param array 查询条件 * @param array 需要返回的字段 * @return array 查询的结果 */ public function find_one($coll_name, $condition = array()

每天200亿次查询 – MongoDB在奇虎360【转】

100多个应用,1,500多个实例,每天200亿次查询 奇虎是中国最大的安卓移动发布平台.奇虎也是中国最顶尖的病毒软件防护公司,同时为网络以及移动平台提供产品.自从2011年成为MongoDB的用户之后,奇虎已经在MongoDB上构建了100多个不同的应用,其中包括新服务以及从MySQL和Redis上迁移过来的服务——每天都会在MongoDB上运行超过1, 500个实例并且支持200亿次查询. 我很高兴能够有一个机会与奇虎的高级DBA——杨艳杰进行交流,了解更多关于他们使用MongoDB的过程及

newlisp通过JavaScript查询MongoDB记录

因为MongoDB支持执行JavaScript文件查询,所以newlisp就可以通过这种方式获得查询结果. 下面是我的newlisp模块: (context 'MONGO_JS_TOOL) (define (query db-name js-file) (set 'cmd (format "mongo localhost/%s %s" db-name js-file)) (set 'r (exec cmd)) (set 'r (STRING_LIST:remove r "^M

查询MongoDB oplog.rs

oplog是Capped Collection,默认分配5%的空闲磁盘空间. 来看下oplog.rs的样子: rs_test:SECONDARY> use local switched to db local rs_test:SECONDARY> db.oplog.rs.findOne(); {         "ts" : Timestamp(1465879171, 238),         "h" : NumberLong("-22754

C#多线程更新,查询MongoDB数据

对多线程一直在用,但是从来没去深入研究过注意的事项,包括和锁的配合也是一知半解没有真正理解锁(lock)的用法. 这次在做数据分析是需要将访问的url中host部分记录,如果已经存在就直接匹配id,没有就新增.为了提升效率马上想到的就是多线程,因为程序自身比较复杂,就大篇幅贴代码了. 主要思路:lock是对实例进行上锁的,如果线程中每个线程都创建了不同的实例那lock的意义也就随之不存在. 如果涉及到多层类的引用和传递,那就在进程入口处做一次实例化,需要类的初始化或者调用时,一层层去传递直到业务

rails查询mongodb通用查询

ruby on rails 很好的跟mongodb进行了结合,gem包: 地址:https://rubygems.org/gems/mongoid 文档:https://docs.mongodb.com/ecosystem/tutorial/ruby-mongoid-tutorial/#ruby-mongoid-tutorial 最新还用的查询 Model.where(name:/abc/) 这个可以查找model表中name字段有abc的所有内容. 分页,可以结合willpage def se

python查询mongodb内数据

初学者,写的不好请指出. #第一步以insertTime为条件查询时间段内的数据 #第二部步可以选择是否再以通话Id为条件筛选第一步所查询出来的数据 #因为使用的是配置文件,所以首先在代码当前目录下创建一个配置文件,db.conf 代码: 1 import configparser 2 import pymongo 3 from pymongo import MongoClient 4 import time 5 6 print('以insertTime为条件查询:可以按通话id筛选数据') 7

在zepplin 使用spark sql 查询mongodb的数据

1.下载zepplin 进入官网下载地址,下载完整tar包. 2.解压 tar zxvf zeppelin-0.7.3.tgz 3.修改配置 新建配置文件 cp zeppelin-env.sh.template zeppelin-env.sh 修改配置文件 vi zeppelin-env.sh # 设置java home 路径 export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.141-1.b16.el7_3.x86_64/jre # 设

Mongodb数据查询 | Mongodb

1.基本查询 ①方法find():查询 db.集合名称.find({条件文档}) ②方法findOne():查询,只返回第一个 db.集合名称.findOne({条件文档}) ③方法pretty():将结果格式化 db.集合名称.find({条件文档}).pretty() 2.比较运算符 # 等于,默认是等于判断,没有运算符 # 小于,$lt less-than # 小于或等于,$lte less-than,equal # 大于,$gt greater-than # 小于或等于,$gte gre