Thinkphp5 海量数据查询分页(paginate)ORDER BY和LIMIT 造成查询很慢的临时解决办法

 一台数据监控后台,图省事就用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.几秒 查询完成。

发表评论

您的电子邮箱地址不会被公开。