背景
我们在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 举报,一经查实,本站将立刻删除。