gpt4 book ai didi

mysql - 优化导出功能

转载 作者:行者123 更新时间:2023-11-29 13:39:59 29 4
gpt4 key购买 nike

我想知道在我的应用程序中加速公司导出功能的最佳方法是什么:

function export(){
ini_set('memory_limit', '-1');
ini_set('max_execution_time', 0);

$conditions = $this->getConditions($this->data);
$resultCompanies = $this->Company->find('all', array('conditions' => $conditions));

$this->set(compact('resultCompanies'));
}

所以它的作用是在数据库中搜索符合某些条件的公司。然后将结果设置为能够在相应的 View 中显示。

如何加快此功能的速度?您想要导出的结果越多,导出它们所需的时间就越多,但是否可以通过某种方式对其进行优化?目前导出 4000 个结果需要大约 30 秒 - 所以我不认为它能够导出 40000 个结果,它应该能够吗?是服务器的问题吗?

谢谢。

最佳答案

这不是服务器的问题,而是程序架构的问题。

由于您已经遇到过的明显原因,您不想动态获取和呈现如此大量的信息。

我不太了解您的应用程序的要求,但我认为您需要下载一份报告。 假设它必须始终是最新的这是我会做的:

用户单击链接下载报告。用户将看到一个显示的加载指示器,以及一条正在使用 JS 和 AJAX 准备报告导出的消息。在服务器端触发任务来构建报告。

后台服务(一个循环运行的简单 CakePHP shell)会注意到有一个新报告需要构建。它将构建报告以 block 的形式读取数据库记录以避免内存不足并将其写入文件。完成后,报告下载请求将被标记为已完成,并且可以下载文件。在客户端,长轮询 JS 脚本注意到文件已准备好并下载它。

另一种解决方案,假设数据不必是最新的,例如,每天一次生成报告文件,并让它们可供下载,而无需任何等待时间用户。在服务器端,任务将保持不变:以 block 的形式读取和写入数据。

关于问题的性能部分:

这并没有使其变得更快,但它为用户提供了反馈,您甚至可以根据已处理的 block 计算(估计)剩余时间,并进一步防止脚本因内存不足而崩溃。 您可以直接将文件流式传输到客户端,而不是将文件写入磁盘。一旦它开始读取第一个 block ,您就会开始发送数据。但是从数据库中读取数据......好吧,我们投入金钱和硬件。如果你有钱的话,我建议你使用带有 SSD 的 RAID5 阵列。预计要投入几千美元。

但即使是最快的数据库读取也会受到您可以发送和用户可以接收的带宽的限制。为了加快数据库速度,我建议您在 superuser.com 上询问,我不是数据库硬件方面的专家,但正确设置的 SSD 配置可以极大地提升您的数据库速度。

仅获取您需要的数据:

我在您的查找中没有看到任何 contains() 或递归设置:确保您只获取报告中真正需要的数据!

关于mysql - 优化导出功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18209945/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com