Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:并行SQL查询与一个大型SQL_Php_Sql_Orm_Parallel Processing - Fatal编程技术网

PHP:并行SQL查询与一个大型SQL

PHP:并行SQL查询与一个大型SQL,php,sql,orm,parallel-processing,Php,Sql,Orm,Parallel Processing,我有一个涉及3个表的查询。假设A,B和C。A是B的主人,B是C的主人。我们也假设每个A吃了至少30个B,每个B至少有100个C 这个要求涉及到展示每个A,然后是A中A的所有B,然后是每个B中的所有C。因此,如果有200个A,这将给我带来600000行 服务器上也有很多并发性,因此如果查询需要很长时间,用户可能会刷新,并且可能会出现内存泄漏 因此,我们正在实施和试验各种解决方案: 执行一个连接3个表的大查询,然后用php组织结果 我们构建了一个模块,可以打开多个http套接字并并行执行多个php页

我有一个涉及3个表的查询。假设A,B和C。A是B的主人,B是C的主人。我们也假设每个A吃了至少30个B,每个B至少有100个C

这个要求涉及到展示每个A,然后是A中A的所有B,然后是每个B中的所有C。因此,如果有200个A,这将给我带来600000行

服务器上也有很多并发性,因此如果查询需要很长时间,用户可能会刷新,并且可能会出现内存泄漏

因此,我们正在实施和试验各种解决方案:

执行一个连接3个表的大查询,然后用php组织结果

我们构建了一个模块,可以打开多个http套接字并并行执行多个php页面。因此,我们可以将每个表放在单独的页面中,收集所需的内容,这些内容已经准备好通过这些套接字进行展示。该模块管理一组结果、可用套接字和渲染,因此数据仅在必要时渲染,而不是在到达时渲染

利与弊:

一,

赞成:数据库为我做了一切。 赞成:如果数据集很小,那么可以同时有更多的并发请求

缺点:在php中有很多处理,如果有太多的记录,许多用户可以永远等待他们的数据到达,因为它是线性呈现的。 缺点:如果用户重新加载,可能会有许多巨大的长时间查询和正在执行的php进程,它们正在消耗内存和处理器

二,。 赞成:在我们所做的测试中,并行php处理速度要快得多,比使用一个进程处理整个过程快500%。 优点:由于进程持续时间很短,内存使用和内存泄漏都会减少

缺点:处理器有时会被套接字执行的并发请求量所阻塞,通过将一页可以打开的套接字数量限制为5来解决这个问题。因此,对于3个表,一次最多可以有125个插座打开,a打开5个,所有Bs打开5个25个,所有Cs打开5125个。 缺点:未完全使用数据库

我们正朝着第二种解决方案可以实现的并行化方向发展。我们认为,通过一点负载平衡,我们可以进一步提高速度,但我们将进一步利用数据库

问题是:

有人做过类似的事情吗? 当您需要使用php生成大型报告时,您做了什么? 您是否已将数据缓冲到文件中? 我们应该用另一种语言生成报告并将其传递给php吗


如果sql能够在庞大的查询中生成不同的数据集,并通过一些参数来组织数据,那将是多么棒

为什么用户需要在一个网页上看到600000行?如果sql可以在这个巨大的查询中生成不同的数据集,并通过一些参数来组织数据,那就太棒了!你是说,像是按顺序还是按分组?此外,您是否可以在用户请求数据时,通过仅向下拉数据来推迟一次全部拉数据?就像当他们点击按钮展开数据集时,信息才会被查询?我知道,如果用户想看到那么多数据,这实际上是因为他们想寻找一些东西。我们已经在GWT中构建了按需交互显示,但一些老用户希望打印整个内容1000页!,我们已经用php构建了所有的东西,这就是为什么。你可以把它们放在一个expand all中打印出来。或者一个打印按钮,它显式地获取所有记录并将它们格式化为正确的打印格式。例如,为什么不将所有这600000行缓存到单独的表中,并每天更新缓存一次呢?据我所知,这600000行仅在非常罕见的情况下使用,当用户想要打印所有内容时。