Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何提高MongoDB性能_Mongodb_Cakephp - Fatal编程技术网

如何提高MongoDB性能

如何提高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

我正在用MongoDB,CakePHP开发一个应用程序。我的数据库中有145000条记录。当我使用以下命令查询记录时,需要12秒。这对我的申请非常不利

$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;