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

 更新时间:2021年07月09日 08:40:44   作者:冷月&  
当数据访问次数过多时,建议使用redis缓存一些固定数据,减少mysql查询次数。今天小编给大家分享PHP导出数据超时的优化建议,感兴趣的朋友一起看看吧

一般情况下,导出超时可能都是以下三种情况:
  一、sql语句复杂,查询时间过长;
  二、处理查询后数据逻辑冗余;
  三、数据量过大导致响应超时。
接下来分别给出这三种情况的优化建议。

一、sql语句复杂,查询时间过长

  1、查看索引是否设置妥当,即所用的查询条件是否有添加索引,当然索引不是越多越好,只需给常用的查询条件加上即可,一般采用B+树的索引方式(具体原因可自行百度,不再赘述)
  2、在查询语句中尽量避免IN、NOT IN、IS NULL、OR、!=、<>、LIKE、OR、NOT EXISTS这些查询条件的出现,会导致索引失效。
- IN查询时,可以考虑用BETWEEN来代替
- LIKE查询时,仅当"%"在前时会索引失效,"%"在后是不会失效的
- 查询条件里还要避免数字的出现,使用字符串,数字也会导致索引失效,例如,查询:"pid"=1,可以优化为"pid"="1"
- 要尽量避免在循环中使用查询语句,这种情况一般可以用join或者with来解决(当涉及到跨库时,请谨慎使用这种方式!)
- 查询时,可以指定需要查询的字段,排除掉不需要的字段避免资源浪费
- 当数据量多大时,可以使用分页和缓存来优化(具体方法请参考数据量过大导致响应超时部分)
温馨提示:在执行查询语句后,可以通过show profiles来查询语句的资源消耗情况来帮助你更好的优化sql语句;关于查询语句是否使用了索引,可以在查询语句前加explain来查看索引使用情况,例如:
explain select * from user where id= '1';

二、处理查询后数据逻辑冗余

- 在做数组循环时,尽量使用continue、break来减少没必要的循环;

- 尽量减少if嵌套层数,在需要用到多个if-else时,使用switch可以提高效率,特别是在数据量大时
- 当进行数组赋值时,
  一次赋一个值,使用$arr[]=1,会比array_push($arr,"1"),更快,
  但是当需要多次赋值时,
    array_push($arr,"1","2","3",...),会比
    $arr[]="1";
    $arr[]="2"
    $arr[]="3"
    ...
  更快
  
- 遍历数组进行赋值时,尽量使用引用的方式,减少内存开销,例如:
  
    foreach($arr as &$item){
      $item = 1;
      ...
    }

三、数据量过大导致响应超时

当数量两过大,又不想用异步的方式导出excel文件时,可以尝试使用csv来作为到处格式,且查询导出数据时可以使用分页的方式查询,导出时利用ob_flush进行缓存。例如:

$page = 1;    // 页面
$pageSize = 1000;    //每页条数
while(
  $list = Db::name("user")->page($page)->limit($pageSize)->select()
)
{
  foreach($list as &$item){
    // TODO 进行相应的逻辑处理
  }
  $page++;
}

当数据访问次数过多时,建议使用redis缓存一些固定数据,减少mysql查询次数。
当然,最好的方式还是使用异步的方式导出,建议使用python或者go语言搭建微服务来进行导出。

到此这篇关于PHP导出数据超时的优化的文章就介绍到这了,更多相关PHP导出数据超时内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • php网上商城购物车设计代码分享

    php网上商城购物车设计代码分享

    我们要做的是一个可以包含促销活动的购物车,所以比较其他简单的购物车,会稍微复杂一点。(用的是PHP的zend framework框架)
    2012-02-02
  • Laravel Eloquent的九个实用特性详解

    Laravel Eloquent的九个实用特性详解

    这篇文章主要为大家介绍了LaravelEloquent的九个实用特性详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • PHP分页类集锦

    PHP分页类集锦

    本文汇集了几个比较好用的php分页类,都是经过广大网友考验的代码了,小伙伴们可以直接拿来使用
    2014-11-11
  • PHP实现新型冠状病毒疫情实时图的实例

    PHP实现新型冠状病毒疫情实时图的实例

    在本篇文章小编给大家分享一篇关于PHP新型冠状病毒肺炎疫情实时图源码内容,有兴趣的朋友们可以本地测试下。
    2020-02-02
  • PHP中如何使用session实现保存用户登录信息

    PHP中如何使用session实现保存用户登录信息

    这篇文章主要给大家介绍在php中是如何使用session实现保存用户登录信息的,涉及到php session 用户登录等一些知识点,使用session保存用户登录信息要比cookie安全很多。感兴趣的朋友一起学习吧
    2015-10-10
  • Thinkphp5+uploadify实现的文件上传功能示例

    Thinkphp5+uploadify实现的文件上传功能示例

    这篇文章主要介绍了Thinkphp5+uploadify实现的文件上传功能,结合实例形式分析了Thinkphp5结合uploadify实现文件上传的具体步骤、原理与相关操作技巧,需要的朋友可以参考下
    2018-05-05
  • php上传文件问题汇总

    php上传文件问题汇总

    这篇文章主要给大家汇总介绍了一些php上传文件问题,需要的朋友可以参考下
    2015-01-01
  • CI框架入门之MVC简单示例

    CI框架入门之MVC简单示例

    这篇文章主要介绍了CI框架入门之MVC简单示例,分析了CI框架MVC架构的原理并结合实例形式演示了CI框架数据查询与显示功能的完整实现技巧,需要的朋友可以参考下
    2016-11-11
  • Zend Framework教程之前端控制器Zend_Controller_Front用法详解

    Zend Framework教程之前端控制器Zend_Controller_Front用法详解

    这篇文章主要介绍了Zend Framework教程之前端控制器Zend_Controller_Front用法,详细分析了前端控制器Zend_Controller_Front的功能,使用方法与相关注意事项,需要的朋友可以参考下
    2016-03-03
  • ThinkPHP3.2.3框架邮件发送功能图文实例详解

    ThinkPHP3.2.3框架邮件发送功能图文实例详解

    这篇文章主要介绍了ThinkPHP3.2.3框架邮件发送功能,结合图文与实例形式详细分析了基于thinkPHP框架进行邮件发送的相关原理、配置及操作技巧,需要的朋友可以参考下
    2019-04-04

最新评论