解决数据加载慢问题

记录一次thinkphp框架,页面加载数据慢问题解决思路
我这里数据库是用的是mongodb

修改配置

首先打开debug配置

// 数据库调试模式
    'debug'           => Env::get('database.debug', true),

查看日志

[ sql ] [ DB ] CONNECT:[ UseTime:0.000012s ]
[ sql ] [ Mongo ] db.count({"count":"user","query":{"$and":[{"id":{"$ne":0}}]},"limit":0}) [ RunTime:5.113134s ]
[ sql ] [ Mongo ] db.user.find({}).sort({"id":-1}).limit(10); [ RunTime:0.003165s ]

由此可见,查询在count()时导致时间太久,然后查看代码具体哪里使用

代码分析

把日志里的查询代码放到命令里执行

db.user.count({id:{$ne:0}})

执行时间会比较长,把count()中的方法去掉,再测试一次,会比较快,到此知道问题出在哪里了。

然后可以去代码中查看

// 这里正是日志里记录的长时间查询条件,注释掉此条代码
// $this->model->where("id","<>",0);

$list = $this->model
    ->order($sort, $order)
    ->paginate($limit);

foreach($list as $k=>$v){
    $v["_id"] = $v["_id"]->__toString() ;
}

$result = array("total" => $list->total(), "rows" => $list->items());

注释代码后,查询数据报错

BSON field 'count.query' is the wrong type 'array', expected type 'object'

原因:在think-mongo版本,vendor/topthink/think-mongo/src/Builder.php文件中,parseWhere方法在做过滤条件初始化的时候,没有考虑周全,将数据类型定义为了数组。

解决办法:
parseWhere方法返回的时候做一个判断,如果$filter为空,就重新定义为stdClass对象。
修改的方法就是在return前添加如下代码:

// 修改代码 开始
if (empty($filter)){ // 返回空对象
    return new \stdClass();
}

继续查询数据

日志记录

[ sql ] [ DB ] CONNECT:[ UseTime:0.000012s ]
[ sql ] [ Mongo ] db.count({"count":"user","query":{},"limit":0}); [ RunTime:0.003134s ]
[ sql ] [ Mongo ] db.user.find({}).sort({"id":-1}).limit(10); [ RunTime:0.003165s ]
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
33
粉丝
5
喜欢
68
收藏
97
排名:472
访问:1.7 万
私信
所有博文
社区赞助商