一台数据监控后台,图省事就用Thinkphp5写了下,数据30万的时候分页就很卡了,基本上6秒才能查询执行完。
基本上是 ORDER BY 和 LIMIT 造成的查询很慢,详细的就不多说了,下面贴一下我自己的解决办法,没有深入去处理,只是个临时解决办法,仅供参考。
涉及文件:\thinkphp\library\think\db\Query.php
涉及函数:paginate
涉及代码:
//$results = $this->options($options)->bind($bind)->page($page, $listRows)->select(); 这是原本的查询代码,注释掉
下面两行是新增的查询代码:
$sql="SELECT * FROM ".$options[‘table’]." INNER JOIN (SELECT id FROM ".$options[‘table’]." ORDER BY ".key($options[‘order’])." ".current($options[‘order’])." LIMIT ".(intval($page)-1)*intval($listRows).",".$listRows.") as a USING (id)";
$results = $this->query($sql);
运行测试SQL:
SELECT * FROM 表名 INNER JOIN (SELECT 主键 FROM 表名 ORDER BY 主键 desc LIMIT 0,20) as a USING (主键)
大致是这个情况,现在无论怎么访问都能控制在 0.几秒 查询完成。