Fat's 杂物屋

  • 首页
  • 关于我
Fat's 杂物屋
python语言工作自动化技术
  1. 首页
  2. 网站构建
  3. 正文

Laravel优化SQL分页查询语句

2022年1月24日 2644点热度 2人点赞 0条评论

好久没更新了……最近自己搭的论坛人数暴涨,数据库的CPU压力太大,要优化一下。

 

后端框架:Laravel

数据库:MySQL

回帖的Posts表约有500万行,thread_id字段代表所属thread。某thread有40000个posts。

 

优化前的PHP语句:

$posts = DB::table('posts')->where('thread_id',$thread_id)->paginate(200);

优化前相应的SQL查询:

select * FROM posts where thread_id = 14690 LIMIT 200 OFFSET 39800;

优化前的查询时间约200ms。

 

优化后的PHP语句:

$sql_child = DB::table('posts')->select('id')->where('thread_id', $thread_id)->offset(39800)->limit(200);//SQL子查询语句

$posts = DB::table('posts')
         ->joinSub($sql_child, 'sql_child', function ($join) use ($posts_table) {
                $join->on('posts.id', '=', 'sql_child.id');})//子查询语句的inner join
         ->get();

优化后相应的SQL查询:

select * FROM posts JOIN(select id  from posts where thread_id= 14690 LIMIT 200 OFFSET 39800) as sql_child on(posts.id = sql_child.id) ;

优化后的查询时间约100ms。约减少一半。

 

原理:

offset查询的时候,实际上所有行都查询一遍,再舍去offset前的行数。

优化后,通过子查询只select符合条件的id字段。再通过id字段join到原有表格所有字段。

虽然子查询id字段的时候,同样是查询所有行再舍去,但毕竟还是比查询所有字段要快得多。

 

结果:

CPU占用改善非常显著!

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: 暂无
最后更新:2022年1月24日

fat

我只是一只海獭。

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

fat

我只是一只海獭。

分类
  • python / 5篇
  • 数码硬件 / 5篇
  • 杂谈 / 1篇
  • 网站构建 / 13篇
最新 热点 随机
最新 热点 随机
laravel 11.x 及 Vue3安装,作为SPA单网页应用框架 ubuntu中部署基于Gradio框架的AI demo(nginx反向代理) ubuntu构建LNMP环境和安装WordPress ubuntu使用flask错误:ImportError: libGL.so.1: cannot open shared object file: No such file or directory解决办法 uWSGI提示错误uwsgi: unrecognized option '--wsgi-file'解决办法 Laravel优化SQL分页查询语句
总之开了个blog Python cv2人脸识别及图像覆盖 Laravel用Composer install时报错:The Process class relies on proc_open Laravel报错Controller不存在 Target class [App\\Http\\Controllers\\API\\***Controller] does not exist Laravel优化SQL分页查询语句 ESXi 开启安全Shell(SSH)

COPYRIGHT © 2023 Fat's 杂物屋. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

粤ICP备2020113573号