gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 07:37:00 25 4
gpt4 key购买 nike

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

背景

我们的 MySQL 数据库中有一个表,预计会变得非常大 - 单个用户在该表中拥有 250,000 行并不罕见。表格中的每一行都给出了金额和日期等信息。

此外,这个特定的表格在大多数页面上被非常频繁地读取(和写入)。鉴于每一行都有一个日期,我使用 GROUP BY date 来最小化 MySQL 给出的结果集的大小 - 包含在同一年的行现在可以看作只是一个总数。

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

尝试 MySQL

在通常的页面上,MySQL 通常需要大约 600-900 毫秒。使用 LIMIT 和偏移量无助于提高性能,并且数据已高度规范化,因此进一步规范化似乎没有帮助。

更糟糕的是,应用程序的某些部分需要从数据库中检索 10,000-15,000 行。然后将结果用于 PHP 的计算并相应地格式化。鉴于此,MySQL 的性能是 Not Acceptable 。

试用 MongoDB

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

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

最后一根稻草

最重要的是,速度很重要。因此,性能是最重要的。

问题:

  1. 在知道大多数查询会检索到非常大的结果集的情况下,存储频繁读取/写入和快速增长的数据的最佳方法是什么?
  2. 是否有其他解决方案?我完全乐于接受建议。

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

最佳答案

我只读了前两行,但您正在使用聚合(GROUP BY)然后期望它只是实时进行?

我会说您是数据库内部的新手,不是要贬低您,而是要尝试帮助您。

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

这意味着您可以通过确保为分组使用索引来在 MySQL 和 MongoDB 中加速它,但这仍然只是到目前为止,即使在 MongoDB 中的直接工作集中放置索引(内存).

事实上,将 LIMITOFFSET 一起使用可能只会进一步降低速度。因为在写出设置后MySQL需要再次查询才能得到你的答案。

完成后它会写出结果,MySQL 会把它写出到一个结果集(这里使用内存和 IO),如果你没有设置 $out,MongoDB 会直接回复,内联输出的最大大小为 16MB(文档的最大大小)。

这里要指出的最后一点是:聚合很糟糕

这里没有 Elixir 可以拯救你,一些数据库会试图吹嘘它们的速度等等,但事实上大多数大型聚合器都使用一种叫做“预聚合报告”的东西。您可以在 MongoDB 文档中找到快速介绍:http://docs.mongodb.org/ecosystem/use-cases/pre-aggregated-reports/

这意味着您将聚合和分组的工作放在其他一些进程上,这些进程可以很容易地完成它,从而允许您的阅读线程,需要实时进行的线程是实时的。

关于php - 哪个数据库用于处理非常大的结果集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29936515/

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