如何提高MongoDB性能
我正在用MongoDB,CakePHP开发一个应用程序。我的数据库中有145000条记录。当我使用以下命令查询记录时,需要12秒。这对我的申请非常不利如何提高MongoDB性能,mongodb,cakephp,Mongodb,Cakephp,我正在用MongoDB,CakePHP开发一个应用程序。我的数据库中有145000条记录。当我使用以下命令查询记录时,需要12秒。这对我的申请非常不利 $params= array('aggregate'=>array( array('$project'=>array('as'=>1,'pid'=>1,'st'=>1)), array('$unwind'=>'$as'), array('$ma
$params= array('aggregate'=>array(
array('$project'=>array('as'=>1,'pid'=>1,'st'=>1)),
array('$unwind'=>'$as'),
array('$match' => array('pd'=>array('$gt'=>$f,'$lt'=>$t),'pid'=>$project_id)),
array('$group'=>array('_id'=>'$as')),
array('$sort'=>array('_id'=>1)),
array('$limit'=>10)
)
);
$results = $this->Detail->find('all',array('conditions'=>$params));
谁能帮我缩短查询时间
我在上有索引作为和pid。我的系统RAM是1.5GB
结果我得到了以下数据
[1] => Array
(
[Detail] => Array
(
[_id] => Array
(
[0] => "superfone" Llc,moscow,ru
)
)
)
[2] => Array
(
[Detail] => Array
(
[_id] => Array
(
[0] => "superphone" Llc,moscow,ru
)
)
)
在执行查找之前,请确保将递归级别设置为所需的级别,然后报告性能
$this->Detail->recursive = -1; // no joins
results = $this->Detail->find('all',array('conditions'=>$params));
或
不确定您需要什么级别的递归,所以给他们一个测试,但默认值为1,这可能是一个代价高昂的练习
ref
参考文件还说,要使-1成为默认值,并根据需要提高递归级别,可以通过向AppModel添加以下内容来实现
public $recursive = -1;
我正在用数据结构编辑问题。但我确信没有递归发生。只提供所需的详细信息表数据。请查看更新的问题和检索的数据。确定吗?你试过了吗?默认值1返回所有hasMany项之间有很大区别。我觉得这就是问题所在,数组('$match'=>array('pd'=>array('$gt'=>$f,$lt'=>$t),'pid'=>$project_id)),但我无法指出它……我的模型中没有hasmall和其他关系。pd是优先日期,$f&$t是年。请尝试在MongoDB上运行聚合脚本,以排除是您的MongoDB查询还是CakePHP。如果是MongoDB,我们将知道如何更好地解决它。。。。这样做并更新您的问题。从MongoDb控制台:
db.stats()
从正确的数据库。结果?看起来您在所有145k文档中展开了一个数组…这不是最佳的。另外,请尝试从控制台运行聚合。需要多长时间?您可以迭代地查找每个管道步骤的相对成本。如果可能,将$match
放在$project
之前。另外,为什么在$project
中包含st
字段,然后不使用它?当$project
中不包含$match
字段时,为什么要引用pd
字段?我支持@wiredpairie建议您在mongo
shell中运行聚合查询。这将有助于将CakePHP
的任何开销从底层查询中分离出来,您还可以测试一次添加一个管道步骤,以了解哪些步骤比较慢。假设您的$match
步骤是在一个数组中筛选匹配的文档,您还应该在管道的开头添加一个类似的$match
,以便您只处理匹配的文档,而不是该集合中的所有文档。问题得到了解决,因为在具有8GB RAM的live server上只需1s。但我肯定会尝试@wiredparie提供的一些优化
public $recursive = -1;