当数据访问次数过多时,建议使用redis缓存一些固定数据,减少mysql查询次数。今天小编给大家分享PHP导出数据超时的优化建议,感兴趣的朋友一起看看吧
一般情况下,导出超时可能都是以下三种情况: 一、sql语句复杂,查询时间过长; 二、处理查询后数据逻辑冗余; 三、数据量过大导致响应超时。接下来分别给出这三种情况的优化建议。
一、sql语句复杂,查询时间过长 1、查看索引是否设置妥当,即所用的查询条件是否有添加索引,当然索引不是越多越好,只需给常用的查询条件加上即可,一般采用B+树的索引方式(具体原因可自行百度,不再赘述) 2、在查询语句中尽量避免IN、NOT IN、IS NULL、OR、!=、<>、LIKE、OR、NOT EXISTS这些查询条件的出现,会导致索引失效。
二、处理查询后数据逻辑冗余
- 在做数组循环时,尽量使用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语言搭建微服务来进行导出。
相关推荐
© 2020 asciim码
人生就是一场修行