• 售前

  • 售后

热门帖子
入门百科

PHP导出数据超时的优化建议

[复制链接]
luly靓 显示全部楼层 发表于 2021-8-14 14:18:24 |阅读模式 打印 上一主题 下一主题
一般情况下,导出超时大概都是以下三种情况:
  一、sql语句复杂,查询时间过长;
  二、处理查询后数据逻辑冗余;
  三、数据量过大导致响应超时。
接下来分别给出这三种情况的优化发起。
一、sql语句复杂,查询时间过长

  1、查看索引是否设置妥当,即所用的查询条件是否有添加索引,固然索引不是越多越好,只需给常用的查询条件加上即可,一般接纳B+树的索引方式(具体原因可自行百度,不再赘述)
  2、在查询语句中尽量制止IN、NOT IN、IS NULL、OR、!=、<>、LIKE、OR、NOT EXISTS这些查询条件的出现,会导致索引失效。
- IN查询时,可以考虑用BETWEEN来取代
- LIKE查询时,仅当"%"在前时会索引失效,"%"在后是不会失效的
- 查询条件里还要制止数字的出现,使用字符串,数字也会导致索引失效,比方,查询:"pid"=1,可以优化为"pid"="1"
- 要尽量制止在循环中使用查询语句,这种情况一般可以用join大概with来办理(当涉及到跨库时,请审慎使用这种方式!)
- 查询时,可以指定需要查询的字段,排撤除不需要的字段制止资源浪费
- 当数据量多大时,可以使用分页和缓存来优化(具体方法请参考数据量过大导致响应超时部分)
温馨提示:在实行查询语句后,可以通过
  1. show profiles
复制代码
来查询语句的资源斲丧情况来资助你更好的优化sql语句;关于查询语句是否使用了索引,可以在查询语句前加
  1. explain
复制代码
来查看索引使用情况,比方:
  1. explain select * from user where id= '1';
复制代码
二、处理查询后数据逻辑冗余
  1. - 在做数组循环时,尽量使用continue、break来减少没必要的循环;
  2. - 尽量减少if嵌套层数,在需要用到多个if-else时,使用switch可以提高效率,特别是在数据量大时
  3. - 当进行数组赋值时,
  4.   一次赋一个值,使用$arr[]=1,会比array_push($arr,"1"),更快,
  5.   但是当需要多次赋值时,
  6.     array_push($arr,"1","2","3",...),会比
  7.     $arr[]="1";
  8.     $arr[]="2"
  9.     $arr[]="3"
  10.     ...
  11.   更快
  12.   
  13. - 遍历数组进行赋值时,尽量使用引用的方式,减少内存开销,例如:
  14.   
  15.     foreach($arr as &$item){
  16.       $item = 1;
  17.       ...
  18.     }
复制代码
三、数据量过大导致响应超时

当数目两过大,又不想用异步的方式导出excel文件时,可以实验使用csv来作为随处格式,且查询导出数据时可以使用分页的方式查询,导出时使用ob_flush进行缓存。比方:
  1. $page = 1;    // 页面
  2. $pageSize = 1000;    //每页条数
  3. while(
  4.   $list = Db::name("user")->page($page)->limit($pageSize)->select()
  5. )
  6. {
  7.   foreach($list as &$item){
  8.     // TODO 进行相应的逻辑处理
  9.   }
  10.   $page++;
  11. }
复制代码
当数据访问次数过多时,发起使用redis缓存一些固定命据,淘汰mysql查询次数。
固然,最好的方式还是使用异步的方式导出,发起使用python大概go语言搭建微服务来进行导出。
到此这篇关于PHP导出数据超时的优化的文章就介绍到这了,更多干系PHP导出数据超时内容请搜索脚本之家以前的文章或继承欣赏下面的干系文章盼望大家以后多多支持脚本之家!

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作