PHP导出数据超时的优化建议
作者:冷月& 发布时间:2023-06-29 18:36:32
一般情况下,导出超时可能都是以下三种情况:
一、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语言搭建微服务来进行导出。
来源:https://www.cnblogs.com/ycold/p/14984368.html
猜你喜欢
- 什么是存储过程呢?定义:将常用的或很复杂的工作,预先用SQL语句写好并用一个指定的名称存储起来, 那么以后要叫数据库提供与已定义好的存储过程
- 1. 选用适合的ORACLE优化器 ORACLE的优化器共有3种: a. RULE (基于规则) b. COST (基于成本) c. CHO
- 1:除非你现在已经过了不惑之年了,否则你就一定要保持年轻人特有的激情!这里的激情,包含了那种说不明白的近似于冲动的东西,或者idea。也包含
- 同质化的网站越来越多,往往你还没发展起来,就已有许多站点抄袭走了你的成果,如何留下用户?——让用户有更好的使用体验。一些网页上的小技巧,可以
- 惊叹于老外的发现 《CSS Background image on html image element?》,自己从没关注过,也没想过如此的
- asp时间加减运算 和转换问题 a=2007-07-24 2:23:15 b=2005-06-25 2:23:15 问题1 如何将a转换成2
- PDO::errorCodePDO::errorCode — 获取跟数据库句柄上一次操作相关的 SQLSTATE(PHP 5 >= 5
- 很神奇的一个晚上,居然在以前老同事的群里跟同事讨论起CSS的东西来了,不过很意外的还是有收获。在IE中常常会碰到如果将容器定位后,出现容器内
- 现在IE7已经推出一段时间并且渗透到用户当中,不用等太久我们就可以在页面上使用更高级的CSS。两个最有用的项目将是 Child子和Adjac
- iframe的防插与强插(一)中介绍了“市面上”能见到的两种防御被第三方网站iframe的方法,以及相应的变态突破方法。貌似把“受害人”逼上
- 本文通过实例解析了 SQL Server 数据库扩展存储过程,实现远程备份与恢复的方法和步骤实例说明: 环境:win2k+sqlserver
- 利用MySQLfs这个工具,我么可以在MySQL关系数据库中存储文件系统。MySQLfs将文件系统中文件的字节内容分解成数据库中的元组,而数
- 如何显示一个等待或欢迎信息? <% Response.Buffer = True %
- 代码如下:CREATE TABLE [dbo].[TbGuidTable]( [TableName] [varchar](50) NOT N
- 压缩数据库文件可以提高数据库的性能,但是有些时候在压缩数据库时,系统会提醒用户该数据库不能压缩。如果在Access数据库中删除数据库对象,或
- SQL Server 客户端配置工具用于配置客户端的工具(除基于DOS操作系统的客户端工具以外),以便使它们可以成功地和SQL Server
- 介绍两个关键的CSS <style media="print">  
- 1 数据库连接a.数据库的连接(ACCESS和SQL)在APS脚本中可以通过3中方式访问数据库: ∈IDC (Inte
- 由于ACCESS本身没有提供在窗体中添加一个命令按钮实现打开通用对话框的控件,所以大家必须通过编写相关的宏才能实现此功能,但是编写出的宏限制
- SQL查询输出,根据表内某字段为准,输出不重复记录,或删除掉重复的记录,保留所需要的记录。今儿见一朋友在蓝色里问起(查询不重复记录~),想想