Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.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 哪个数据库用于处理非常大的结果集?_Php_Mysql_Performance_Mongodb_Scalability - Fatal编程技术网

Php 哪个数据库用于处理非常大的结果集?

Php 哪个数据库用于处理非常大的结果集?,php,mysql,performance,mongodb,scalability,Php,Mysql,Performance,Mongodb,Scalability,我目前正在开发一个PHP应用程序(预发行版) 背景 我们的MySQL数据库中有一个表,它预计会变得非常大——一个用户在这个表中拥有250000行并不罕见。表中的每一行都有一个金额和日期等信息 此外,在大多数页面上,此特定表格的读取(和写入)频率非常高。考虑到每一行都有一个日期,我使用groupbydate来最小化MySQL给出的结果集的大小——同一年中包含的行现在可以看作是一个总数 但是,一个典型页面的结果集仍然在1000-3000个结果之间。还有一些地方执行了许多SUM(),总计数十行(如果不

我目前正在开发一个PHP应用程序(预发行版)

背景

我们的MySQL数据库中有一个表,它预计会变得非常大——一个用户在这个表中拥有250000行并不罕见。表中的每一行都有一个金额和日期等信息

此外,在大多数页面上,此特定表格的读取(和写入)频率非常高。考虑到每一行都有一个日期,我使用
groupbydate
来最小化MySQL给出的结果集的大小——同一年中包含的行现在可以看作是一个总数

但是,一个典型页面的结果集仍然在1000-3000个结果之间。还有一些地方执行了许多
SUM()
,总计数十行(如果不是数百行的话)和数千行

尝试MySQL

在通常的页面上,MySQL通常需要大约600-900毫秒。使用
LIMIT
和偏移量对性能没有帮助,数据已经严重标准化,因此进一步标准化似乎没有帮助

更糟糕的是,应用程序的某些部分需要从数据库中检索10000-15000行。然后,PHP将结果用于计算并相应地格式化。因此,MySQL的性能是不可接受的

尝试MongoDB

我已经将表转换为MongoDB,它的速度更快——检索2000个文档通常需要250毫秒左右。但是,聚合管道中的
$group
命令(需要根据字段所属年份聚合字段)会减慢速度。不幸的是,无论何时删除/更新/插入文档,都不可能保留总额并进行更新,因为尽管我们可以对应用程序的某些部分使用年度总额,但在其他部分,计算要求每个金额都在特定日期

我也考虑过Redis,尽管我认为数据的复杂性超出了Redis的设计目的

最后一根稻草

最重要的是,速度很重要。因此,绩效取决于优先级

问题:

  • 在知道大多数查询将检索非常大的结果集的情况下,存储频繁读/写且快速增长的数据的最佳方式是什么
  • 这个问题还有别的解决办法吗?我完全愿意接受建议

  • 我现在有点困了,我还没能在可接受的时间内检索到这么大的结果集。似乎大多数数据存储都适合于小规模的检索—即使是在大数据量的情况下—但我还没有找到任何关于从更大的表/集合中检索大量数据的方法。

    我只阅读了前两行,但您使用的是聚合(
    GROUP BY
    ),然后期望它只执行实时操作

    我要说的是,你对数据库的内部结构是新手,不是想破坏你,而是想尝试帮助你

    MySQL和MongoDB中的组运算符都在内存中。换句话说,它采用您提供的任何数据结构,无论是索引还是文档(行),它将遍历每一行/文档,并将字段分组

    这意味着您可以在MySQL和MongoDB中通过确保使用索引进行分组来加快它的速度,但这仍然仅限于此,即使索引包含在MongoDB(内存)中的直接工作集中

    事实上,将
    限制
    偏移量
    一起使用可能会进一步降低速度。因为在写出集合MySQL之后,需要再次查询才能得到答案

    一旦完成,它将输出结果,MySQL将输出结果到结果集(这里使用的是内存和IO),如果您没有设置
    $out
    ,MongoDB将以内联方式回复,内联输出的最大大小为16MB(文档的最大大小)

    最后一点是:聚合非常可怕

    在这里,并没有什么灵丹妙药可以拯救你们,一些数据库会试图吹嘘自己的速度等等,但事实是,大多数大型聚合器都使用一种叫做“预聚合报告”的东西。您可以在MongoDB文档中找到快速介绍:


    <>这意味着你把聚合和分组的努力放在某个其他过程中,它可以很容易地完成你的阅读线程,一个需要实时处理它的线程。说到聚合/统计,它真的很棒。通常情况下,结合MongoDB编写Elastica索引并使其在后台保持最新是一个好主意。当您查看核心时,没有数据库,也没有一个软件项目可以做与MySQL不同的事情。事实上,MySQL每次运行缓慢都是因为它没有配置。如果你想要性能,你需要硬件资源——充足的RAM、良好的CPU和快速的SSD。如果你没有这些,在软件方面你几乎无法在一台过时的计算机上快速运行。长话短说-你的MySQL配置是什么?您希望所有内容都能放入内存中,以便所有聚合都能快速进行。@iamtankist我没有考虑Elastica。人们似乎正在处理一些问题。我不知道情况是否仍然如此?你自己用过吗?注意:我的MySQL服务器位于我本地机器上的一个流浪箱上,它可以很好地处理其他情况。我并不认为硬件一定是这里的瓶颈,但是,我可能错了。硬件永远是瓶颈。这就是MySQL附带默认co的原因