微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

背景

我们在MysqL数据库中有一个表,预计会变得非常大 – 单个用户在此表中拥有250,000行并不罕见.表中的每一行都有一个数量一个日期等等.

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

但是,典型页面仍将具有1000-3000个结果之间的结果集.还有许多SUM()被执行的地方,总共有几十行 – 如果不是几十万行.

尝试MysqL

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

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

尝试MongoDB

我已经将表转换为MongoDB,速度更快 – 通常需要大约250毫秒来检索2,000个文档.但是,聚合管道中的$group命令 – 需要根据它们落入的年份来聚合字段 – 减慢了速度.不幸的是,保留总数并在文档被删除/更新/插入时更新也是不可能的,因为虽然我们可以使用应用程序的某些部分的年度总计,但在其他部分,计算要求每个金额都落在具体日期.

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

最后的稻草

除此之外,速度很重要.因此,绩效就是优先顺序.

问题:

>知道大多数查询将检索非常大的结果集,那么存储经常读/写和快速增长的数据的最佳方法是什么?
>这个问题有另一个解决方案吗?我完全乐于接受建议.

我现在有点陷入困境,我无法在可接受的时间内找回如此大的结果集.似乎大多数数据存储都适用于小的检索大小 – 即使是大量的数据 – 但我还没有找到任何从更大的表/集合中检索大量数据的东西.

解决方法:

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

我会说你是数据库内部的新手,不是为了破坏你,而是试图帮助你.

MysqL和MongoDB中的组运算符都在内存中.换句话说,它采用您提供的任何数据结构,无论是索引还是文档(行),它将通过每个行/文档获取字段并对其进行分组.

这意味着你可以通过确保使用索引进行分组来加快MysqL和MongoDB的速度,但这仍然只是到目前为止,即使在MongoDB(内存)的直接工作集中包含索引.

事实上,使用带有OFFSET的LIMIT可能只会让事情进一步放慢速度.由于在写出集合MysqL后,需要再次查询以获得答案.

一旦完成,它将写出结果,MysqL会将其写入结果集(此处使用的内存和IO),如果你没有设置$out,MongoDB将内联回复,内联输出的最大大小为16MB(文件的最大尺寸).

这里带走的最后一点是:聚合是可怕的

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

这意味着您将聚合和分组的工作放在其他可以轻松完成的过程中,从而允许您的阅读线程,即需要实时实现的线程.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐