一般情况下,导出超时可能都是以下三种情况:

  一、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语言搭建微服务来进行导出。

最新文章

  1. django之DB操作
  2. Java泛型 E、T、K、V、N
  3. 注意ArrayAdapter的Add()方法
  4. Spring+MyBatis多数据源配置实现
  5. mac和centos下git安装
  6. JAVA SERVLET专题(上)
  7. SGU 117.Counting
  8. Unity问答——请教一下NGUI的图片转换问题
  9. 第2个Wiindows程序讲解
  10. django获取某一个字段的列表,values/values_list/flat
  11. linux实用指令---持续更新
  12. 上证A股股指跌破1900
  13. android简单的计算器
  14. !DOCTYPE html文档类型声明简写 HTML5 DOCTYPE缩写
  15. [ An Ac a Day ^_^ ] CodeForces 426C Sereja and Swaps 优先队列
  16. (11)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- Thrift高效通讯 (完结)
  17. poj3074 DLX精确覆盖
  18. Composer 的autoload 实现
  19. python 自然语言处理(二)____获得文本语料和词汇资源
  20. 视图不能由多个 ListView 共享 (View can&#39;t be shared by more than one ListView) 的一个解决方法

热门文章

  1. bashshell删除列
  2. 2.7循环_while
  3. Linux下使用LVM管理(扩展/缩小/删除)
  4. 自动驾驶QNX,Linux,Autosar概述
  5. YOLO、SSD、FPN、Mask-RCNN检测模型对比
  6. 特斯拉Tesla Model 3整体架构解析(上)
  7. C++标准模板库(STL)——set常见用法详解
  8. 虹软人脸识别SDK接入Milvus实现海量人脸快速检索
  9. windows10环境下gcc环境变量的配置
  10. 升级 macOS Big Sur 差点丢了我多年的珍藏文件(夹)!!!